Usuário com melhor resposta
Subtotal

Pergunta
-
Amigos.
Tenho a seguinte pesquisa:
Estab. Deposito Produto Lote Data Movto. Tipo Movto. Qtde. 1 99 10.000069 4 12/06/13 40 12,08 1 99 10.000069 4 13/06/13 500 -12,08 3 99 10.000069 4 13/06/13 200 12,08 3 99 10.000069 4 20/06/13 501 -12,08 3 98 10.000069 4 20/06/13 201 12,08 3 98 10.000069 4 20/06/13 330 -6,448 3 98 10.000069 4
21/06/13
330
-0,08
Presciso criar subtotais que fiquem desta maneira:
Estab. Deposito Produto Lote Data Movto. Tipo Movto. Qtde. 1 99 10.000069 4 12/06/13 40 12,08 1 99 10.000069 4 13/06/13 500 -12,08 0,000 3 99 10.000069 4 13/06/13 200 12,08 3 99 10.000069 4 20/06/13 501 -12,08 0,000 3 98 10.000069 4 20/06/13 201 12,08 3 98 10.000069 4 20/06/13 330 -6,448 3 98 10.000069 4 21/06/13 330 -0,08 5,552
O Subtotal deve ser por Estab/Deposito/Produto/Lote
Tentei com subgrupo mas o resultado nao e mo esperado.
Alguem tem uma solucao?
Grato
Eduardo
Respostas
-
Boa tarde,
Eduardo, acho que você também pode experimentar utilizando Grouping Sets conforme exemplo abaixo:
SELECT Estab, Deposito, Produto, Lote, DataMov, SUM(Qtde) As Total FROM Tabela GROUP BY GROUPING SETS ( (Estab, Deposito, Produto, Lote, DataMov, Qtde), (Estab, Deposito, Produto, Lote) )
Espero que seja útil.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta EduardoARodrigues segunda-feira, 5 de agosto de 2013 17:06
Todas as Respostas
-
Eduardo,
Segue um exemplo de select:
--Table creation and data load IF(OBJECT_ID('TabelaDeposito') IS NOT NULL) DROP TABLE TabelaDeposito CREATE TABLE TabelaDeposito ( Estab INT, Deposito INT, Produto VARCHAR(100), Lote INT, DataMov VARCHAR(100), TipoMov INT, Qtde DECIMAL(18,2) ) INSERT INTO TabelaDeposito(Estab, Deposito, Produto, Lote, DataMov, TipoMov, Qtde) VALUES (1, 99, '10.000069', 4, '12/06/13', 40, 12.08), (1, 99, '10.000069', 4, '13/06/13', 500, -12.08), (3, 99, '10.000069', 4, '13/06/13', 200, 12.08), (3, 99, '10.000069', 4, '20/06/13', 501, -12.08), (3, 98, '10.000069', 4, '20/06/13', 201, 12.08), (3, 98, '10.000069', 4, '20/06/13', 330, -6.448), (3, 98, '10.000069', 4, '21/06/13', 330, -0.08) --Final select SELECT * FROM ( SELECT Estab, Deposito, Produto, Lote, DataMov, --TipoMov, --Qtde, SUM(Qtde) As Total FROM TabelaDeposito GROUP BY CUBE(Estab, Deposito, Produto, Lote, DataMov) ) a WHERE (a.Estab IS NOT NULL AND a.Deposito IS NOT NULL AND a.Produto IS NOT NULL AND a.Lote IS NOT NULL AND a.DataMov IS NOT NULL) OR (a.Estab IS NOT NULL AND a.Deposito IS NOT NULL AND a.Produto IS NOT NULL AND a.Lote IS NOT NULL AND a.DataMov IS NULL) ORDER BY a.Estab, a.Deposito, a.Produto, a.Lote
<b>Fabrizzio A. Caputo</b><br/> Certificações:<br/> MCT<br/> MCC<br/> Oracle OCA 11g<br/> MCITP SQL Server 2008 BI<br/> MCITP SQL Server 2008 Implementation and Maintenance<br/> MCITP SQL Server 2008 Developer<br/> ITIL V3 Foundation <br/> Blog Pessoal: <a href="http://fabrizziocaputo.wordpress.com">www.fabrizziocaputo.wordpress.com</a><br/> Email: fabrizzio.antoniaci@gmail.com
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 24 de dezembro de 2018 00:21
-
Bom dia minha maneira pode ser a não adequada mas cheguei no resultado fazendo dessa forma.
DECLARE @tblExtrato AS TABLE(Estab INT, Deposito INT, Produto VARCHAR(20), Lote INT, DataMov DATETIME, TipoMov INT, Qtde FLOAT ) INSERT @tblExtrato VALUES (1,99,'10.000069',4,'12-06-2013',40,12.08), (1,99,'10.000069',4,'13-06-2013',500,-12.08), (3,99,'10.000069',4,'13-06-2013',200,12.08), (3,99,'10.000069',4,'20-06-2013',501,-12.08), (3,98,'10.000069',4,'20-06-2013',201,12.08), (3,98,'10.000069',4,'20-06-2013',330,-6.448), (3,98,'10.000069',4,'21-06-2013',330,-0.08) ;WITH Extrato AS ( SELECT Estab,Deposito,Produto,Lote,DataMov,TipoMov,Qtde FROM @tblExtrato) , TotalExtrato AS (SELECT Estab,Deposito,SUM(Qtde) AS Qtde FROM Extrato GROUP BY Estab,Deposito) SELECT * FROM Extrato WHERE Estab = 1 AND Deposito=99 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,Qtde FROM TotalExtrato WHERE Estab = 1 AND Deposito = 99 UNION ALL SELECT * FROM Extrato WHERE Estab = 3 AND Deposito=99 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,Qtde FROM TotalExtrato WHERE Estab = 3 AND Deposito = 99 UNION ALL SELECT * FROM Extrato WHERE Estab = 3 AND Deposito=98 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,Qtde FROM TotalExtrato WHERE Estab = 3 AND Deposito = 98
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br -
Bom dia minha maneira pode ser a não adequada mas cheguei no resultado fazendo dessa forma.
DECLARE @tblExtrato AS TABLE(Estab INT, Deposito INT, Produto VARCHAR(20), Lote INT, DataMov DATETIME, TipoMov INT, Qtde FLOAT ) INSERT @tblExtrato VALUES (1,99,'10.000069',4,'12-06-2013',40,12.08), (1,99,'10.000069',4,'13-06-2013',500,-12.08), (3,99,'10.000069',4,'13-06-2013',200,12.08), (3,99,'10.000069',4,'20-06-2013',501,-12.08), (3,98,'10.000069',4,'20-06-2013',201,12.08), (3,98,'10.000069',4,'20-06-2013',330,-6.448), (3,98,'10.000069',4,'21-06-2013',330,-0.08) ;WITH Extrato AS ( SELECT Estab,Deposito,Produto,Lote,DataMov,TipoMov,Qtde FROM @tblExtrato) , TotalExtrato AS (SELECT Estab,Deposito,SUM(Qtde) AS Qtde FROM Extrato GROUP BY Estab,Deposito) SELECT * FROM Extrato WHERE Estab = 1 AND Deposito=99 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,Qtde FROM TotalExtrato WHERE Estab = 1 AND Deposito = 99 UNION ALL SELECT * FROM Extrato WHERE Estab = 3 AND Deposito=99 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,Qtde FROM TotalExtrato WHERE Estab = 3 AND Deposito = 99 UNION ALL SELECT * FROM Extrato WHERE Estab = 3 AND Deposito=98 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,Qtde FROM TotalExtrato WHERE Estab = 3 AND Deposito = 98
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.brDavi,
O problema desta solução é que ela é engessada, ou seja, se entrar um novo estabelecimento por exemplo será necessário atualizar essa query.
<b>Fabrizzio A. Caputo</b><br/> Certificações:<br/> MCT<br/> MCC<br/> Oracle OCA 11g<br/> MCITP SQL Server 2008 BI<br/> MCITP SQL Server 2008 Implementation and Maintenance<br/> MCITP SQL Server 2008 Developer<br/> ITIL V3 Foundation <br/> Blog Pessoal: <a href="http://fabrizziocaputo.wordpress.com">www.fabrizziocaputo.wordpress.com</a><br/> Email: fabrizzio.antoniaci@gmail.com
-
Obrigado Fabrizzio , por isso citei que pode ser a não adequada. Até porque mesmo o CUBE que de fato é o mais viável ainda assim não traz exatamente o resultado esperado como o nosso amigo Eduardo tinha colocado.
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br -
Boa tarde,
Eduardo, acho que você também pode experimentar utilizando Grouping Sets conforme exemplo abaixo:
SELECT Estab, Deposito, Produto, Lote, DataMov, SUM(Qtde) As Total FROM Tabela GROUP BY GROUPING SETS ( (Estab, Deposito, Produto, Lote, DataMov, Qtde), (Estab, Deposito, Produto, Lote) )
Espero que seja útil.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta EduardoARodrigues segunda-feira, 5 de agosto de 2013 17:06
-
Fabrizzio,
Obrigado pela resposta.
Estou adequando sua proposta em meu relatorio.
So encontrei um problema.
Ao adicionar o campo TIPO_MOVTO, que e bastante importante, o resultado, que ate o momento estava correto, passa a demonstrar varias linhas para o mesmo Estab/Deposito.
Voce sabe me informar o motivo desta alteracao?
Grato
Eduardo
-
-