Array
(
)

Select count dentro de uma clausula where ou no left join

Jorge Meneses
   - 07 jul 2010

Oi sou novato e estou encontrando problemas em um sql explicando pra melhor entender possuo tabela pessoa, movimentocongregacao,congregacao, caixa preciso listar mensalmente o valor total do caixa no periodo de um ano, acontece que preciso separar por congregacao no movimentocongregacao eu tenho data inclusa e exclusao entao comparando com a data do caixa eu sei qual a congregacao que estava no dia do caixa e consigo fazer normalmente acontece que se pessoa nao teve movimentocongregacao eu nao consigo, selecionar apenas os que o count do movimentocongregacao é = zero, alguem poderia me ajudar???? obrigado...

Emerson
   - 07 jul 2010

publique a instrução que você utilizou.

Jorge Meneses
   - 07 jul 2010

o primeiro pega quem na data do caixa estava ativo em alguma congregacao apos union all pega quem na epoca estava em alguma congregacao como falei antes problema é pegar que nao teve congregacao e quem na epoca do caixa nao estava em nenhuma congregacao     select distinct en.nome nomeigreja,co.nome as congregacao,co.codigo,li.nome lider,pe.nome,pe.sexo,pe.membro,ct.nome conta,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 1 and year (ca.data) = 2010)JAN,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 2 and year (ca.data) = 2010)FEV,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 3 and year (ca.data) = 2010)MAR,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 4 and year (ca.data) = 2010)ABR,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 5 and year (ca.data) = 2010)MAI,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 6 and year (ca.data) = 2010)JUN,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 7 and year (ca.data) = 2010)JUL,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 8 and year (ca.data) = 2010)AGO,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 9 and year (ca.data) = 2010)SEP,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 10 and year (ca.data) = 2010)OCT,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 11 and year (ca.data) = 2010)NOV,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 12 and year (ca.data) = 2010)DEZ,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and year (ca.data) = 2010)Total
from dbo.caixa ca
left join dbo.congregacaomovimento cm on cm.codpessoa = ca.cliente
and (ca.data >= cm.datainclusao and cm.dataexclusao is null)
left join pessoa pe on pe.codigo = cm.codpessoa
left join congregacao co on co.codigo = cm.codcongregacao
left join entidade en on en.codigo = ca.codentidade
left join caixaconta cc on cc.caixaconta = ca.codigo
left join conta ct on ct.codigo = cc.codconta
inner join parametros pa on pa.contapadraodizimo = ct.codigo
left join celulaintegrante ci on ci.codpessoa = pe.codigo
left join celula ce on ce.codigo = ci.codcelula
left join pessoa li on li.codigo = ce.lider
where cm.codentidade = 15

union all

select distinct en.nome nomeigreja,co.nome as congregacao,co.codigo,li.nome lider,pe.nome,pe.sexo,pe.membro,ct.nome conta,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 1 and year (ca.data) = 2010)JAN,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 2 and year (ca.data) = 2010)FEV,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 3 and year (ca.data) = 2010)MAR,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 4 and year (ca.data) = 2010)ABR,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 5 and year (ca.data) = 2010)MAI,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 6 and year (ca.data) = 2010)JUN,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 7 and year (ca.data) = 2010)JUL,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 8 and year (ca.data) = 2010)AGO,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 9 and year (ca.data) = 2010)SEP,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 10 and year (ca.data) = 2010)OCT,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 11 and year (ca.data) = 2010)NOV,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and month (ca.data) = 12 and year (ca.data) = 2010)DEZ,
(select sum (cc.valor) from caixaconta cc where cc.caixaconta = ca.codigo and year (ca.data) = 2010)Total

from dbo.caixa ca
left join dbo.congregacaomovimento cm on cm.codpessoa = ca.cliente
and (ca.data >= cm.datainclusao and ca.data <= cm.dataexclusao)
left join pessoa pe on pe.codigo = cm.codpessoa
left join congregacao co on co.codigo = cm.codcongregacao
left join entidade en on en.codigo = ca.codentidade
left join caixaconta cc on cc.caixaconta = ca.codigo
left join conta ct on ct.codigo = cc.codconta
inner join parametros pa on pa.contapadraodizimo = ct.codigo
left join celulaintegrante ci on ci.codpessoa = pe.codigo
left join celula ce on ce.codigo = ci.codcelula
left join pessoa li on li.codigo = ce.lider

where cm.codentidade = 15
order by co.nome,li.nome,pe.nome

Emerson
   - 07 jul 2010

torne a tabela pessoa a tabela principal da sua instrução.

algo assim:

select
  en.nome nomeigreja, co.nome congregacao, co.codigo,
  li.nome lider, pe.nome, pe.sexo, pe.membro, ct.nome conta,
  sum(case when month(ca.data) =  1 then cc.valor else 0 end) JAN,
  sum(case when month(ca.data) =  2 then cc.valor else 0 end) FEV,
  sum(case when month(ca.data) =  3 then cc.valor else 0 end) MAR,
  sum(case when month(ca.data) =  4 then cc.valor else 0 end) ABR,
  sum(case when month(ca.data) =  5 then cc.valor else 0 end) MAI,
  sum(case when month(ca.data) =  6 then cc.valor else 0 end) JUN,
  sum(case when month(ca.data) =  7 then cc.valor else 0 end) JUL,
  sum(case when month(ca.data) =  8 then cc.valor else 0 end) AGO,
  sum(case when month(ca.data) =  9 then cc.valor else 0 end) SEP,
  sum(case when month(ca.data) = 10 then cc.valor else 0 end) OCT,
  sum(case when month(ca.data) = 11 then cc.valor else 0 end) NOV,
  sum(case when month(ca.data) = 12 then cc.valor else 0 end) DEZ,
  sum(cc.valor) TOTAL
from pessoa pe
left join dbo.caixa ca on ca.cliente = pe.codigo
  and ca.data between '01.01.2010' and '31.12.2010'
left join dbo.congregacaomovimento cm on cm.codpessoa = pe.codpessoa
  and cm.datainclusao >= ca.data and cm.dataexclusao is null
left join congregacao co on co.codigo = cm.codcongregacao
left join entidade en on en.codigo = ca.codentidade
left join caixaconta cc on cc.caixaconta = ca.codigo
left join conta ct on ct.codigo = cc.codconta
inner join parametros pa on pa.contapadraodizimo = ct.codigo
left join celulaintegrante ci on ci.codpessoa = pe.codigo
left join celula ce on ce.codigo = ci.codcelula
left join pessoa li on li.codigo = ce.lider
where cm.codentidade = 15
group by
  en.nome, co.nome, co.codigo,
  li.nome, pe.nome, pe.sexo, pe.membro, ct.nome

Jorge Meneses
   - 07 jul 2010

Oi Emerson, acho que vc nao entendeu, esse que postei esta funcionando, mas sao pessoas que tem congregacaomovimento o meu problema é listar apenas pessoa que nao teve congregacaomovimento nesse caso imagino que teria que ter um select pe.pessoa,count (cm.codpessoa) cujo having count (cm.pessoa)=0 ai entao eu listo apenas quem nao tem movimento, problema é que ja testei em tudo que é lugar e nao consegui rsrsrs mas é como te disse sou novato, vai ver eu que nao te entendi rsrsrs  

Emerson
   - 07 jul 2010

e se você trocar

inner join parametros pa on pa.contapadraodizimo = ct.codigo

por

left join parametros pa on pa.contapadraodizimo = ct.codigo