none
Consulta agrupando por 12 últimos registros RRS feed

  • Pergunta

  • Amigos,

    Estou tentando criar uma consulta para retornar os 12 últimos registros da forma abaixo. Porém, dá erro pedindo para incluir o campo ZRM_DATFIM  no group.. porém, não posso fazer isso, senão não consigo retornar a soma geral. Como resolver?

    SELECT TOP 12
      SUM(X.ZRM_BASCOM)

     FROM [OFICIAL]..[ERP].[ZRM090] X

     WHERE X.ZRM_FILIAL = '04'
     AND X.ZRM_CODIGO = '200355'

     GROUP BY X.ZRM_FILIAL, X.ZRM_CODIGO
     ORDER BY X.ZRM_DATFIM DESC


    quinta-feira, 11 de julho de 2019 15:49

Respostas

Todas as Respostas

  • Boa tarde,

    Experimente dessa forma:

    with CTE_TOP as
    (
        SELECT TOP 12 X.ZRM_BASCOM
        FROM [OFICIAL]..[ERP].[ZRM090] X
        WHERE X.ZRM_FILIAL = '04'
        AND X.ZRM_CODIGO = '200355'
        ORDER BY X.ZRM_DATFIM DESC
    )
    
    SELECT SUM(X.ZRM_BASCOM)
    FROM CTE_TOP

    Espero que ajude


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

    quinta-feira, 11 de julho de 2019 16:54
  • Ricardo,

    Remova inicialmente a linha do Order By, mais especificamente a coluna X.ZRM_DATFIM, veja se este código funciona.

    Sempre que utilizamos funções de agregação e indicamos nomes de colunas no Select ou no Order By, estas respectivas colunas devem ser declaradas no Group BY.

    Veja este cenário que te ilustra este erro e também uma solução: 

    Create Table Produtos
    (Codigo Int,
     Descricao Varchar(10),
     Quantidade SmallInt)
    GO
    
    Insert Into Produtos Values (1,'Arroz',10), (2,'Feijão',5), (3,'Maizena',20)
    Go
    
    -- Aqui vai dar erro --
    Select Descricao, Sum(Quantidade) From Produtos
    Go
    
    -- Resolvendo --
    Select Descricao, Sum(Quantidade) From Produtos
    Group By Descricao
    Go

    Você destaca que não pode utilizar esta coluna, então terá que mudar a estratégia do seu Select, talvez fazer uso de uma VIEW ou CTE pode ser a solução.

    Veja este exemplo:

    -- Criando uma CTE --

    ;With CTETrazer12Linhas As ( Select Top 12 X.ZRM_BASCOM From [OFICIAL]..[ERP].[ZRM090] X Where X.ZRM_FILIAL = '04' And X.ZRM_CODIGO = '200355' ) SELECT SUM(X.ZRM_BASCOM) FROM CTETrazer12Linhas Order By X.ZRM_DATFIM DESC

    -- Criando uma View --
    Create View VTrazer12Linhas
    As
      Select Top 12 X.ZRM_BASCOM As BasCom
      From [OFICIAL]..[ERP].[ZRM090] X
      Where X.ZRM_FILIAL = '04'
      And X.ZRM_CODIGO = '200355'
      Order By X.ZRM_DATFIM DESC
    Go
    
    -- Executando a View --
    Select Sum(BasCom) As Soma From VTrazer12Linhas
    Go

    Não consigo afirmar se o uso do Order By dentro da CTE é melhor do que utilizar fora, isso vai depender da sua necessidade e análise.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    • Editado Junior Galvão - MVPMVP quinta-feira, 11 de julho de 2019 17:11 Corrigindo os códigos de exemplo postados....
    quinta-feira, 11 de julho de 2019 16:58