Quero no select mas não no group by

SQL Server

SQL

Transact-SQL

30/03/2021

Galera, bom dia.

Estou com um "problema". Fiz uma consulta para um relatório, só que ao emitir o relatório ele repete as linhas de acordo a quantidade de meses do relatório. Ex se pesquisar de janeiro a março repete cada item 3x.
Ocorre que na select ele pede para colocar a coluna da data no group by ou usar algum agregador, só que eu não quero por no group by:

SELECT distinct(SMK.SMK_NOME) as smk_nome,
       SUM ( SMM.SMM_QT ) as qtd,
       SUM ( SMM.SMM_VLR ) as vlr,
       SUM ( SMM.SMM_AJUSTE_VLR )vlr_ajustado,
		 month(OSM.OSM_DTHR) as mes,
		 year(OSM.OSM_DTHR) as ano

 FROM smk, osm, smm

 WHERE (  SMM.SMM_SFAT <> ''C''  ) AND
       ( OSM.OSM_SERIE = SMM.SMM_OSM_SERIE ) AND
       ( OSM.OSM_NUM = SMM.SMM_OSM ) AND
       ( SMK.SMK_TIPO = SMM.SMM_TPCOD ) AND
       ( SMK.SMK_COD = SMM.SMM_COD ) AND
		 ( SMK.SMK_TIPO = ''S'' ) AND
       ( (''OJ''=''OJ'') )  AND
       ( SMM.SMM_COD IN  ( :Item_Código ) or ''%'' in ( :Item_Código ) ) AND 
       ( ( OSM.OSM_DTHR >= :Data_Inicio AND
            OSM.OSM_DTHR < :Data_Fim ) )

 GROUP BY (SMK.SMK_NOME), month(OSM.OSM_DTHR), year(OSM.OSM_DTHR)

 ORDER BY SMK.SMK_NOME
Isnar Filho

Isnar Filho

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

30/03/2021

quando se usa group by é desnecessário utilizar distinct.
SELECT SMK.SMK_NOME as smk_nome,
       SUM ( SMM.SMM_QT ) as qtd,
       SUM ( SMM.SMM_VLR ) as vlr,
       SUM ( SMM.SMM_AJUSTE_VLR )vlr_ajustado,
         month(OSM.OSM_DTHR) as mes,
         year(OSM.OSM_DTHR) as ano
 
 FROM smk, osm, smm
 
 WHERE (  SMM.SMM_SFAT <> 'C'  ) AND
       ( OSM.OSM_SERIE = SMM.SMM_OSM_SERIE ) AND
       ( OSM.OSM_NUM = SMM.SMM_OSM ) AND
       ( SMK.SMK_TIPO = SMM.SMM_TPCOD ) AND
       ( SMK.SMK_COD = SMM.SMM_COD ) AND
         ( SMK.SMK_TIPO = 'S' ) AND
       ( ('OJ'='OJ') )  AND
       ( SMM.SMM_COD IN  ( :Item_Código ) or '%' in ( :Item_Código ) ) AND
       ( ( OSM.OSM_DTHR >= :Data_Inicio AND
            OSM.OSM_DTHR < :Data_Fim ) )
 
 GROUP BY SMK.SMK_NOME, month(OSM.OSM_DTHR), year(OSM.OSM_DTHR)
 
 ORDER BY SMK.SMK_NOME

você precisa apresentar mês e ano? se precisar, não vai ter jeito. sempre vai apresentar mais de uma linha.
mas se puder tirar o mês e o ano da lista de campos...
SELECT SMK.SMK_NOME as smk_nome,
       SUM ( SMM.SMM_QT ) as qtd,
       SUM ( SMM.SMM_VLR ) as vlr,
       SUM ( SMM.SMM_AJUSTE_VLR )vlr_ajustado
 
 FROM smk, osm, smm
 
 WHERE (  SMM.SMM_SFAT <> 'C'  ) AND
       ( OSM.OSM_SERIE = SMM.SMM_OSM_SERIE ) AND
       ( OSM.OSM_NUM = SMM.SMM_OSM ) AND
       ( SMK.SMK_TIPO = SMM.SMM_TPCOD ) AND
       ( SMK.SMK_COD = SMM.SMM_COD ) AND
         ( SMK.SMK_TIPO = 'S' ) AND
       ( ('OJ'='OJ') )  AND
       ( SMM.SMM_COD IN  ( :Item_Código ) or '%' in ( :Item_Código ) ) AND
       ( ( OSM.OSM_DTHR >= :Data_Inicio AND
            OSM.OSM_DTHR < :Data_Fim ) )
 
 GROUP BY SMK.SMK_NOME
 
 ORDER BY SMK.SMK_NOME

você pode avaliar o uso de PIVOT TABLE para tentar levar tudo pra linha
GOSTEI 0
Isnar Filho

Isnar Filho

30/03/2021

quando se usa group by é desnecessário utilizar distinct.
SELECT SMK.SMK_NOME as smk_nome,
       SUM ( SMM.SMM_QT ) as qtd,
       SUM ( SMM.SMM_VLR ) as vlr,
       SUM ( SMM.SMM_AJUSTE_VLR )vlr_ajustado,
         month(OSM.OSM_DTHR) as mes,
         year(OSM.OSM_DTHR) as ano
 
 FROM smk, osm, smm
 
 WHERE (  SMM.SMM_SFAT <> 'C'  ) AND
       ( OSM.OSM_SERIE = SMM.SMM_OSM_SERIE ) AND
       ( OSM.OSM_NUM = SMM.SMM_OSM ) AND
       ( SMK.SMK_TIPO = SMM.SMM_TPCOD ) AND
       ( SMK.SMK_COD = SMM.SMM_COD ) AND
         ( SMK.SMK_TIPO = 'S' ) AND
       ( ('OJ'='OJ') )  AND
       ( SMM.SMM_COD IN  ( :Item_Código ) or '%' in ( :Item_Código ) ) AND
       ( ( OSM.OSM_DTHR >= :Data_Inicio AND
            OSM.OSM_DTHR < :Data_Fim ) )
 
 GROUP BY SMK.SMK_NOME, month(OSM.OSM_DTHR), year(OSM.OSM_DTHR)
 
 ORDER BY SMK.SMK_NOME

você precisa apresentar mês e ano? se precisar, não vai ter jeito. sempre vai apresentar mais de uma linha.
mas se puder tirar o mês e o ano da lista de campos...
SELECT SMK.SMK_NOME as smk_nome,
       SUM ( SMM.SMM_QT ) as qtd,
       SUM ( SMM.SMM_VLR ) as vlr,
       SUM ( SMM.SMM_AJUSTE_VLR )vlr_ajustado
 
 FROM smk, osm, smm
 
 WHERE (  SMM.SMM_SFAT <> 'C'  ) AND
       ( OSM.OSM_SERIE = SMM.SMM_OSM_SERIE ) AND
       ( OSM.OSM_NUM = SMM.SMM_OSM ) AND
       ( SMK.SMK_TIPO = SMM.SMM_TPCOD ) AND
       ( SMK.SMK_COD = SMM.SMM_COD ) AND
         ( SMK.SMK_TIPO = 'S' ) AND
       ( ('OJ'='OJ') )  AND
       ( SMM.SMM_COD IN  ( :Item_Código ) or '%' in ( :Item_Código ) ) AND
       ( ( OSM.OSM_DTHR >= :Data_Inicio AND
            OSM.OSM_DTHR < :Data_Fim ) )
 
 GROUP BY SMK.SMK_NOME
 
 ORDER BY SMK.SMK_NOME

você pode avaliar o uso de PIVOT TABLE para tentar levar tudo pra linha


Ano não é obrigatório, mas mês infelizmente sim. O cerne do relatório é a separação mensal.
GOSTEI 0
POSTAR