Consulta SQL Server Ordenada

SQL Server

21/02/2017

Bom dia, amigos.

Antes de mais nada, gostaria de dizer que pesquisei aqui no fórum (e outros também) sobre este assunto, encontrei vários casos similares mas nenhum deles me ajudou efetivamente, por isso esta postagem aqui.

Estou realizando uma consulta em que preciso unir duas tabelas e que ela mostra somente os clientes pertinentes à consulta, que filtrei por meio da cláusula WHERE.
O código que escrevi é este:

SELECT T0.CardCode as 'Código',
CASE T0.GroupCode WHEN '109' THEN 'Brokers Supreme' WHEN '110' THEN 'Distribuidores' WHEN '112' THEN 'Distribuição Direta' WHEN '116' THEN 'Eventos' ELSE 'Outros' END as 'Tipo de Distribuidor',
T0.CardName as 'Nome do Cliente',

--T1.DocNum as 'Nº nota',
--T1.DocDate as 'Data de Emissão',
T1.DocTotal as 'Total da nota'

FROM OCRD T0 INNER JOIN OINV T1 ON T0.CardName = T1.CardName
WHERE T0.GroupCode in ('109', '110', '112', '116')

GROUP BY T0.CardCode, T0.GroupCode, T0.CardName, T1.DocTotal
ORDER BY T0.CardName ASC

Porém, preciso que, ao executar, seja exibida a tabela com os clientes agrupados em uma única linha, e que o total da nota seja somado e fique toda a informação de cada cliente em uma linha única, porém, o único resultado que consigo é este:

Código Tipo de Distribuidor Nome do Cliente Total da nota

C00326 Distribuição Direta A & G LTDA 633.990000
C00326 Distribuição Direta A & G LTDA 660.010000
C00326 Distribuição Direta A & G LTDA 683.990000
C00326 Distribuição Direta A & G LTDA 803.990000
C00326 Distribuição Direta A & G LTDA 1115.980000
C00326 Distribuição Direta A & G LTDA 1178.000000
C00378 Brokers Supreme ADELINO DO NASCIMENTO 472.000000
C00378 Brokers Supreme ADELINO DO NASCIMENTO 584.000000
C00378 Brokers Supreme ADELINO DO NASCIMENTO 1111.980000
C00378 Brokers Supreme ADELINO DO NASCIMENTO 1255.980000
C00256 Distribuição Direta ADIMIR TELLES 634.000000
C00256 Distribuição Direta ADIMIR TELLES 651.980000
C00256 Distribuição Direta ADIMIR TELLES 1525.970000

Pode ter alguma relação com o número da nota fiscal, mesmo ele não trazendo a informação na consulta?
Marcos Queiroz

Marcos Queiroz

Curtidas 0

Melhor post

Fabiano Carvalho

Fabiano Carvalho

21/02/2017

Voce precisa usar uma função de agregação, nesse caso SUM

SELECT T0.CardCode as 'Código',
CASE T0.GroupCode WHEN '109' THEN 'Brokers Supreme' WHEN '110' THEN 'Distribuidores' WHEN '112' THEN 'Distribuição Direta' WHEN '116' THEN 'Eventos' ELSE 'Outros' END as 'Tipo de Distribuidor',
T0.CardName as 'Nome do Cliente',
Sum(T1.DocTotal) as 'Total da nota'
FROM OCRD T0 INNER JOIN OINV T1 ON T0.CardName = T1.CardName
WHERE T0.GroupCode in ('109', '110', '112', '116')
GROUP BY T0.CardCode,CASE T0.GroupCode WHEN '109' THEN 'Brokers Supreme' WHEN '110' THEN 'Distribuidores' WHEN '112' THEN 'Distribuição Direta' WHEN '116' THEN 'Eventos' ELSE 'Outros' END,T0.CardName
ORDER BY T0.CardName ASC
GOSTEI 1

Mais Respostas

Marcos Queiroz

Marcos Queiroz

21/02/2017

Voce precisa usar uma função de agregação, nesse caso SUM

SELECT T0.CardCode as ''Código'',
CASE T0.GroupCode WHEN ''109'' THEN ''Brokers Supreme'' WHEN ''110'' THEN ''Distribuidores'' WHEN ''112'' THEN ''Distribuição Direta'' WHEN ''116'' THEN ''Eventos'' ELSE ''Outros'' END as ''Tipo de Distribuidor'',
T0.CardName as ''Nome do Cliente'',
Sum(T1.DocTotal) as ''Total da nota''
FROM OCRD T0 INNER JOIN OINV T1 ON T0.CardName = T1.CardName
WHERE T0.GroupCode in (''109'', ''110'', ''112'', ''116'')
GROUP BY T0.CardCode,CASE T0.GroupCode WHEN ''109'' THEN ''Brokers Supreme'' WHEN ''110'' THEN ''Distribuidores'' WHEN ''112'' THEN ''Distribuição Direta'' WHEN ''116'' THEN ''Eventos'' ELSE ''Outros'' END,T0.CardName
ORDER BY T0.CardName ASC



Faabiianooc

Muito obrigado, funcionou perfeitamente.
Eu usei anteriormente a função SUM mas não retornava este resultado. Vi que na correção que você fez, na declaração GROUP BY, você replicou a informação contida no CASE que eu não tinha feito.

Isso implica em alguma coisa na hora de executar o código?
GOSTEI 0
Fabiano Carvalho

Fabiano Carvalho

21/02/2017

As vezes sim, as vezes não.
Mas de qualquer forma, é sempre bom replicar o que está no SELECT para o group by. ;)
GOSTEI 1
Marcos Queiroz

Marcos Queiroz

21/02/2017

Blz, Faabiianooc.

Valeu a ajuda, agora vou tentar incrementar mais ainda o código :)
GOSTEI 0
POSTAR