none
Agrupamento com subselect RRS feed

  • Pergunta

  •  Ao tentar fazer um select com agrupamento e um subselect com agrupamento, ele pede para agrupar por colunas de interligação entre eles,

     
    SELECT 
       CIT.ITEMID
       ,IT.NAME
       ,SUM(CIT.TOTALDALINHA)
       ,SUM(CIT.QUANTIDADE)
       ,    (SELECT 
                SUM(TAXAS.TOTAL) 
             FROM TAXAS 
             WHERE TAXAS.ITEMTRANSIT = CIT.ITEMTRANSIT
             ) as ValorImpostos
      FROM   
         TRANSACOES CIT 
           INNER JOIN ITEM IT ON CIT.ITEMID = IT.ITEMID
      WHERE
          CIT.DATANOTA >= @DATAINICIAL 
     AND  CIT.DATANOTA <= @DATAFINAL
    
     GROUP BY 
          CIT.ITEM, IT.NAME
    
     O Sql pede para incluir no group By o campo CIT.ITEMTRANSIT , mas se agrupar por este campo, ele me traz por NF e perde toda razão da soma.
    quarta-feira, 5 de novembro de 2014 17:18

Respostas

  • Experimente dessa forma:

    with CTE_Taxas as
    (
        SELECT 
            CIT.ITEMTRANSIT,
            SUM(TX.TOTAL) AS ValorImpostos
        FROM TRANSACOES CIT 
        INNER JOIN TAXAS TX
            ON TX.ITEMTRANSIT = CIT.ITEMTRANSIT
        WHERE
            CIT.DATANOTA >= @DATAINICIAL AND
            CIT.DATANOTA <= @DATAFINAL
        GROUP BY
            CIT.ITEMTRANSIT
    )
    
    SELECT 
        CIT.ITEMID
        ,IT.NAME
        ,SUM(CIT.TOTALDALINHA)
        ,SUM(CIT.QUANTIDADE)
        ,SUM(TX.ValorImpostos)
    FROM TRANSACOES CIT 
    INNER JOIN ITEM IT 
        ON CIT.ITEMID = IT.ITEMID
    INNER JOIN CTE_Taxas TX
        ON TX.ITEMTRANSIT = CIT.ITEMTRANSIT
    WHERE
        CIT.DATANOTA >= @DATAINICIAL AND
        CIT.DATANOTA <= @DATAFINAL
    GROUP BY 
        CIT.ITEM
        ,IT.NAME
    

    Espero que ajude.


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

    quarta-feira, 5 de novembro de 2014 17:52

Todas as Respostas

  • William,

    Como você esta fazendo uso de funções de agregação em conjunto com as colunas no mesmo Select, por padrão e regra o SQL Server requer que todas a colunas que não estão em uso com funções de agregação sejam declaradas no Select no lista do Group By.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    quarta-feira, 5 de novembro de 2014 17:26
  • Obrigado Junior Galvão;

    Teria uma sugestão como posso fazer esta consulta ?

    quarta-feira, 5 de novembro de 2014 17:29
  • Boa tarde,

    William, como é o relacionamento da tabela Transacoes com a tabela Taxas? É de 1:1, 1:N ou outro?


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

    quarta-feira, 5 de novembro de 2014 17:36
  • 1 : N

     é que a tabela de Taxas tem relação com a tabela tipos de taxas
     então ficaria assim

     ITEMTRANSIT  |  TIPOTAXAS  | TOTAL |

        001                  PIS               10,00

        001               ICMS                20,00

    quarta-feira, 5 de novembro de 2014 17:38
  • Experimente dessa forma:

    with CTE_Taxas as
    (
        SELECT 
            CIT.ITEMTRANSIT,
            SUM(TX.TOTAL) AS ValorImpostos
        FROM TRANSACOES CIT 
        INNER JOIN TAXAS TX
            ON TX.ITEMTRANSIT = CIT.ITEMTRANSIT
        WHERE
            CIT.DATANOTA >= @DATAINICIAL AND
            CIT.DATANOTA <= @DATAFINAL
        GROUP BY
            CIT.ITEMTRANSIT
    )
    
    SELECT 
        CIT.ITEMID
        ,IT.NAME
        ,SUM(CIT.TOTALDALINHA)
        ,SUM(CIT.QUANTIDADE)
        ,SUM(TX.ValorImpostos)
    FROM TRANSACOES CIT 
    INNER JOIN ITEM IT 
        ON CIT.ITEMID = IT.ITEMID
    INNER JOIN CTE_Taxas TX
        ON TX.ITEMTRANSIT = CIT.ITEMTRANSIT
    WHERE
        CIT.DATANOTA >= @DATAINICIAL AND
        CIT.DATANOTA <= @DATAFINAL
    GROUP BY 
        CIT.ITEM
        ,IT.NAME
    

    Espero que ajude.


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

    quarta-feira, 5 de novembro de 2014 17:52
  • Funcionou,
    Obrigado

    quinta-feira, 6 de novembro de 2014 11:19