none
Duvida na query usando SUM RRS feed

  • Pergunta

  • Boa tarde!

    Não sei se vão entender, mas vamos lá. 

    Como faço uma subquery que acumula e logo em seguida acumula novamente. Mais ou menos isso: 

    SELECT SUM((
                  (SELECT SUM(CASE WHEN Classe IN (90,100) THEN QTDE ELSE 0 END) AS PESVEN
                   FROM Saidas A
                   INNER JOIN Saidas_Produtos ON Saidas_Produtos.Sequencia = A.Sequencia
                   INNER JOIN Produtos ON PRODUTOS.Codigo = Saidas_Produtos.Codigo
                   GROUP BY A.DATA, A.cupom_fiscal, Classe) AS PESVEN))
    FROM S8_REAL.dbo.Saidas B
    GROUP BY B.DATA,
             B.Cupom_Fiscal

    Tentei usar o with, mas sem sucesso

    with B 
    AS(
    SELECT 
    	DATA	          AS DATMOV, 
    	A.Cupom_Fiscal	  AS NUMDOC,
    	SUM(CASE WHEN Classe IN (90,100) THEN QTDE ELSE 0 END) AS PESVEN,
    	SUM(CASE WHEN Classe IN (300)    THEN QTDE ELSE 0 END) AS PESREV
       FROM Saidas A
       INNER JOIN Saidas_Produtos ON Saidas_Produtos.Sequencia = A.Sequencia
       INNER JOIN Produtos ON PRODUTOS.Codigo = Saidas_Produtos.Codigo
       GROUP BY A.DATA, A.cupom_fiscal, Classe)  
    SELECT DATA AS DATMOV,
           Cupom_Fiscal AS NUMDOC,
           SUM(PESVEN) AS PESVEN,
           SUM(PESREV) AS PESREV     
    FROM S8_REAL.dbo.Saidas B
    GROUP BY B.DATA,
             B.Cupom_Fiscal           

    OBS: 

    PESVEN e PESREV é da tabela Saidas_Produtos

    DATMOV e NUMDOC é da tabela Saidas

    Ficarei grato, caso possa ajudar !

    Att,


    quinta-feira, 26 de novembro de 2015 17:22

Respostas

  • Experimente mais ou menos dessa forma:

    with 
        CTE_View as
        (
            -- a última versão query da View
        ),
    
        CTE_Saidas as
        (
            -- sua query completa sem as 2 subquerys que acessam a View e sem o Order By
        )
    
    select
        c.*,
        v.PESVEN,
        v.PESREV
    from CTE_Saidas as c
    inner join CTE_View as v
        on 
            v.DATMOV = c.Data_Cupom and
            v.NUMDOC = c.Cupom_Fiscal
    -- Order by original

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 26 de novembro de 2015 20:02

Todas as Respostas

  • Boa tarde Gabriel!

    Qual é o retorno previsto?

    Por favor, de um pouco mais de informações.

    Abraço


    @SQLCrespi

    quinta-feira, 26 de novembro de 2015 17:27
  • Quando eu executo esse primeiro código 

    SELECT 
    	DATA			  AS DATMOV, 
    	SAIDAS.Cupom_Fiscal	  AS NUMDOC,
    	SUM(CASE WHEN Classe IN (90,100) THEN QTDE ELSE 0 END) AS PESVEN,
    	SUM(CASE WHEN Classe IN (300)    THEN QTDE ELSE 0 END) AS PESREV	
    FROM Saidas	
    INNER JOIN Saidas_Produtos ON
    Saidas_Produtos.Sequencia = Saidas.Sequencia
    INNER JOIN Produtos ON
    PRODUTOS.Codigo = Saidas_Produtos.Codigo
    GROUP BY DATA, saidas.cupom_fiscal, Classe    

    Essa daqui me retorna valores assim, eu só estou usando três linhas de retorno porque senão o exemplo ia ficar grande:  
    Resultado retornado, primeira View

    DATMOV         NUMDOC       PESVEN       PESREV
    2015-11-25      99999        2,00         0,00
    2015-11-25      99999        0,00         1,00
    2015-10-01      99998        8,00         5,00


    Eu gero valores para os campos PESVEN e PESREV. Só que preciso refinar ainda mais, então essa query de cima fica em uma VIEW, e existe uma segunda VIEW que tem essa primeira View no FROM, onde faço um refinamento, segue:

    SELECT 
     DATMOV   AS DATMOV,
     NUMDOC   AS NUMDOC,
     SUM(PESVEN)  AS PESVEN,
     SUM(PESREV)  AS PESREV
     FROM View_PesoVenda
     GROUP BY DATMOV, NUMDOC

    Resultado retornado, segunda view

    DATMOV       NUMDOC     PESVEN    PESREV
    
    2015-11-25   99999      2,00      1,00
    2015-10-01   99998      8,00      5,00


    Enfim, eu estou retirando a view, então queria fazer de uma forma que não precisasse usar View. Olha pela estrutura da primeira view, ele faz o sum no campo e depois renomeia ele e agrupa, na segunda view ela soma novamente os campos que forma somados no primeiro select, mas agrupando agora por DATMOV e NUMDOC

    Entenderam porque eu esta tentando aquele (SUM (SUM)) ou utiliza o WITH 






    quinta-feira, 26 de novembro de 2015 17:58
  • Boa tarde,

    Gabriel, pelo que entendi acredito que é possível obter o resultado desejado só com a primeira query se você remover a coluna Classe do Group By.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 26 de novembro de 2015 18:47
  • Opa, retorno o mesmo resultado, deu certo!

    Agora eu tenho esse dois Select que chamam a primeira view que tem aquele SUM, e que chama a segunda VIew que tem aquele outro SUM. Só que nesse select eu tenho esse SUM novamente, que acumula os campos da segunda view. 

      (SELECT SUM(PESVEN)
       FROM S8_REAL.dbo.View_PesoVendido
       WHERE NUMDOC = SAIDAS.Cupom_Fiscal
         AND DATMOV = SAIDAS.Data_Cupom) AS PESVEN,
    
      (SELECT SUM(PESREV)
       FROM S8_REAL.dbo.View_PesoVendido
       WHERE NUMDOC = SAIDAS.Cupom_Fiscal
         AND DATMOV = SAIDAS.Data_Cupom) AS PESREV


    Tem alguma forma de mudar a estrutura desse select, utilizando como base o select sem o Group By Classe, segue ele: 

    SELECT 
     DATA      AS DATMOV, 
     SAIDAS.Cupom_Fiscal   AS NUMDOC,
     SUM(CASE WHEN Classe IN (90,100) THEN QTDE ELSE 0 END) AS PESVEN,
     SUM(CASE WHEN Classe IN (300)    THEN QTDE ELSE 0 END) AS PESREV 
    FROM Saidas 
    INNER JOIN Saidas_Produtos ON
    Saidas_Produtos.Sequencia = Saidas.Sequencia
    INNER JOIN Produtos ON
    PRODUTOS.Codigo = Saidas_Produtos.Codigo
    GROUP BY DATA, saidas.cupom_fiscal

    Segue o Select principal, desse select eu já removi três View, agora só falta essa kk Ele é um pouco grande, então vou anexar um link(Só usei esse site para gerar o link mesmo): 

    http://codepad.org/I0BzrAc6

    Desde já agradeço a ajuda! :D

    Att,

    quinta-feira, 26 de novembro de 2015 19:30
  • Experimente mais ou menos dessa forma:

    with 
        CTE_View as
        (
            -- a última versão query da View
        ),
    
        CTE_Saidas as
        (
            -- sua query completa sem as 2 subquerys que acessam a View e sem o Order By
        )
    
    select
        c.*,
        v.PESVEN,
        v.PESREV
    from CTE_Saidas as c
    inner join CTE_View as v
        on 
            v.DATMOV = c.Data_Cupom and
            v.NUMDOC = c.Cupom_Fiscal
    -- Order by original

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 26 de novembro de 2015 20:02
  • Eu testei aqui e pelo jeito funcionou, só tive que alterar esses dois campos 

            v.DATMOV = c.Data_Cupom and
            v.NUMDOC = c.Cupom_Fiscal
    Por
            v.DATMOV = c.DATMOV and
            v.NUMDOC = c.NUMDOC

    Só não vai dar tempo de validar as informações porque tenho que ir para faculdade, mas acredito que resolveu. Muito obrigado Gapimex. Estava quebrando a cabeça. Valeu!

    Se puder explicar a lógica, quando voltar eu vou ler. Mas já foi de grande valia! 

    Att,


    quinta-feira, 26 de novembro de 2015 20:14
  • A primeira CTE foi utilizada para obter o que seria obtido com a View inicial, a segunda CTE foi utilizada para fazer o agrupamento dos outros dados da sua query, e depois foi feito um Join da segunda com a primeira CTE (1:1, pois ambas já estão com os dados agrupados). 

    Não sei se foi o suficiente, qualquer coisa volte a postar.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 26 de novembro de 2015 20:39