Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marcelinho

Left Join

Recommended Posts

Olá pessoal,estou quebrando a cabeça pra fazer funcionar um select que na teoria seria simples!eu tenho uma tabela de faturas, e nela tem todas as faturas, tanto de 2006 quanto de 2007.e o que eu queria do LEFT JOIN é pegar todas as faturas de 2006 e ver a quantidade delas para cada cliente, porém preciso que mostre todos os clientes e não apenas os que tem fatura.Pois os que nao tiver quero que jogue o valor zero.Mais já tentei de todos os jeitos que eu sei e não deu certo.Obrigado desde já galera.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basta testar a condição do JOIN em um case...

 

set nocount oncreate table #cliente ( codcliente  smallint, nomecliente varchar(30))gocreate table #faturas( codcliente smallint, nrofatura  smallint, valor      money)goinsert #cliente values (1, 'Ana Maria')insert #cliente values (2, 'Pedro')insert #cliente values (3, 'Paulo')goinsert #faturas values (1, 10, 50.00)insert #faturas values (1, 12, 70.00)insert #faturas values (3, 11, 20.00)insert #faturas values (3, 13, 35.00)goselect cli.codcliente, cli.nomecliente,        case        when sum(fat.valor) is null       then 0       else sum(fat.valor)        end as totalfrom #cliente cli left join #faturas fat on (cli.codcliente = fat.codcliente)group by cli.codcliente, cli.nomeclientegodrop table #clientedrop table #faturasgoset nocount off
Resulta...

 

codcliente nomecliente total

-----------------------------------------

1 Ana Maria 120.0000

2 Pedro .0000

3 Paulo 55.0000

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então até deu certo, mas quando eu coloquei as datas foi pro mesmo problema que eu estava enfrentando.Pois eu preciso pegar as faturas de um determinado periodo.E se o cliente não existir neste periodo é pra vir o valor zerado!mesmo assim valeu a resposta.Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você precisa tratar um intervalo de datas qualquer e ainda apresentar os clientes que não tem fatura alguma na mesma query, um UNION resolve....

 

select cli.codcliente, cli.nomecliente,casewhen sum(fat.valor) is nullthen 0else sum(fat.valor)end as totalfrom #cliente cli left join #faturas fat on (cli.codcliente = fat.codcliente)where fat.data >= @Data1 and fat.data <= @Data2group by cli.codcliente, cli.nomeclienteUNIONselect cli.codcliente, cli.nomecliente, 0 as totalfrom #cliente cli left join #faturas fat on (cli.codcliente = fat.codcliente)where fat.codcliente is nullgroup by cli.codcliente, cli.nomeclientego

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.