Usuário com melhor resposta
Consulta agrupando por 12 últimos registros

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
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
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
-
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....