Agrupar colunas com 2 SQL Difrentes, é possível?
Olá pessoal,
O que eu quero é o seguinte:
Preciso de um SQL para pegar o total da receita prevista por Mês e por Turma (é uma escola) e outro SQL para pegar o o quanto foi pago por mês e por Turma.
O problema é que não tem como fazer isso com SQL, pois são SQL Totalmente diferentes. Se não fosse o group by daria para fazer com sub-select.
Tem como eu Fazer 2 SQL juntar com outro. Tipo o Union mas o Union junta para baixo (linha). Eu quero juntas as colunas.
Ex.
COL1 COL2 || COLNoVA
Pode ser que exista outra solução, gostaria de sugestões.
obrigado.
O que eu quero é o seguinte:
Preciso de um SQL para pegar o total da receita prevista por Mês e por Turma (é uma escola) e outro SQL para pegar o o quanto foi pago por mês e por Turma.
O problema é que não tem como fazer isso com SQL, pois são SQL Totalmente diferentes. Se não fosse o group by daria para fazer com sub-select.
Tem como eu Fazer 2 SQL juntar com outro. Tipo o Union mas o Union junta para baixo (linha). Eu quero juntas as colunas.
Ex.
COL1 COL2 || COLNoVA
Pode ser que exista outra solução, gostaria de sugestões.
obrigado.
Yallebr
Curtidas 0
Respostas
Emerson Nascimento
26/10/2005
isso não poderia ser feito numa instrução simples, com left join?
publique a instrução que você tentou e, se possível, publique também a estrutura das tabelas envolvidas.
publique a instrução que você tentou e, se possível, publique também a estrutura das tabelas envolvidas.
GOSTEI 0
Gm.gui
26/10/2005
que banco vc está usando, dependendo, daria para fazer select dentro de select, trazendo o resultado como deseja,
GOSTEI 0
Yallebr
26/10/2005
Obrigado pessoal,
Estou tentando fazer com Sub - select ou Stored Procedure. Mas o problema está com o Group by.
Tabelas:
--Aluno--
IdAluno
[b:e04851cfc7]IdTurma Fk[/b:e04851cfc7]
--AlunosParcelas--
IdParcela
[b:e04851cfc7]IdAluno Fk[/b:e04851cfc7]
ValorBruto
ValorPago
Vencimento
O que eu preciso é pegar o Total a Receber por TURMA e por MES. E também o Total Recebido por Turma e por Mês.
O que eu quero é conseguir juntar esses 2 SQL em um só. Assim Ficaria.
IdTurma | Mes | TotalReceber | TotalRecebido
Fui claro? Caso não detalho melhor.
Obrigado.
Estou tentando fazer com Sub - select ou Stored Procedure. Mas o problema está com o Group by.
Tabelas:
--Aluno--
IdAluno
[b:e04851cfc7]IdTurma Fk[/b:e04851cfc7]
--AlunosParcelas--
IdParcela
[b:e04851cfc7]IdAluno Fk[/b:e04851cfc7]
ValorBruto
ValorPago
Vencimento
O que eu preciso é pegar o Total a Receber por TURMA e por MES. E também o Total Recebido por Turma e por Mês.
---Total a Recebido-- select Sum(ValorPago) as TotalRecebido, extract(month from Vencimento) as Mes, A.IdTurma from AlunosParcelas AP left join ALUNOS A on A.IdAluno = AP.idaluno where Pago = 1 and extract(year from Vencimento) = 2005 group by 2,3 ---Total a Receber-- select Sum(ValorBruto) as TotalReceber, extract(month from Vencimento) as Mes, A.IdTurma from AlunosParcelas AP left join ALUNOS A on A.IdAluno = AP.idaluno where Pago = 0 and extract(year from Vencimento) = 2005 group by 2,3
O que eu quero é conseguir juntar esses 2 SQL em um só. Assim Ficaria.
IdTurma | Mes | TotalReceber | TotalRecebido
Fui claro? Caso não detalho melhor.
Obrigado.
GOSTEI 0
Emerson Nascimento
26/10/2005
veja se esse código te ajuda:
note que algumas características/funções só estão disponíveis a partir do FB 1.5.XXXXX
select A.idturma, extract(month from AP.Vencimento) as Mes, (select coalesce(sum(ap2.valorpago),0) from alunosparcelas ap2 inner join alunos a2 on (a2.idaluno=ap2.idaluno) where a2.idturma=a.idturma and ap2.pago=1 and extract(month from AP2.Vencimento)=extract(month from AP.Vencimento) ) ValorPago, (select coalesce(sum(ap2.valorbruto),0) from alunosparcelas ap2 inner join alunos a2 on (a2.idaluno=ap2.idaluno) where a2.idturma=a.idturma and ap2.pago=0 and extract(month from AP2.Vencimento)=extract(month from AP.Vencimento) ) ValorReceber from AlunosParcelas AP left join ALUNOS A on A.IdAluno = AP.idaluno where extract(year from AP.Vencimento) = 2005 group by 1, 2
note que algumas características/funções só estão disponíveis a partir do FB 1.5.XXXXX
GOSTEI 0
Yallebr
26/10/2005
Obrigado funcionou. ;)
GOSTEI 0
Emerson Nascimento
26/10/2005
uma forma mais simples:
select A.idturma, extract(month from AP.Vencimento) as Mes, sum(case when ap.pago=1 then ap.valorpago else 0 end) ValorPago, sum(case when ap.pago=0 then ap.valorbruto else 0 end) ValorReceber from AlunosParcelas AP left join ALUNOS A on A.IdAluno = AP.idaluno where extract(year from AP.Vencimento) = 2005 group by 1, 2
GOSTEI 0
Bruno Belchior
26/10/2005
coloquei assim:Note que especifiquei para trazer o campo de agrupamento em caso de pago a data de pagamento caso não esteja retorna a data de vencimento, em baixo no terceiro sum gostaria de trazer o valor bruto das parcelas relativas ao mês, mas apenas as que vencem no mês, independente de estarem pagas ou não, desta maneira ele retorna o sum das parcelas não pagas em conjunto com o valor bruto das parcelas pagas (independente se seu vencimento seria nesse mês ou não)... como fazer isso?
select A.idturma, extract(month from (case AP.Pagp = 0 then AP.Vencimento else AP.DataPagamento)) as Mes, sum(case when ap.pago=1 then ap.valorpago else 0 end) ValorPago, sum(case when ap.pago=0 then ap.valorbruto else 0 end) ValorReceber, sum(valorbruto) ValorTotalOriginal from AlunosParcelas AP left join ALUNOS A on A.IdAluno = AP.idaluno where extract(year from AP.Vencimento) = 2005 group by 1, 2
GOSTEI 0
Emerson Nascimento
26/10/2005
é só usar o [b:b28517e36a]case[/b:b28517e36a] para avaliar o mês:
select A.idturma, extract(month from (case when AP.Pago = 0 then AP.Vencimento else AP.DataPagamento end)) as Mes, sum(case when ap.pago=1 then ap.valorpago else 0 end) ValorPago, sum(case when ap.pago=0 then ap.valorbruto else 0 end) ValorReceber, sum(case when extract(month from (case when AP.Pago = 0 then AP.Vencimento else AP.DataPagamento end)) = extract(month from AP.Vencimento) then AP.ValorBruto else 0 end) ValorTotalOriginal from AlunosParcelas AP left join ALUNOS A on A.IdAluno = AP.idaluno where extract(year from AP.Vencimento) = 2005 group by 1, 2
GOSTEI 0
Bruno Belchior
26/10/2005
eu até tinha feito isso... porém quando o pagamento for efetuado em um mês diferente do original seu valor será ignorado, e eu preciso dele no seu mês de valor original...
GOSTEI 0
Emerson Nascimento
26/10/2005
para funcionar da forma que você quer não será possível utilizar a condição para a extração do mês. o correto seria:
select A.idturma, extract(month from AP.Vencimento) as Mes, sum(case when ap.pago=1 then ap.valorpago else 0 end) ValorPago, sum(case when ap.pago=0 then ap.valorbruto else 0 end) ValorReceber, sum(AP.ValorBruto) ValorTotalOriginal from AlunosParcelas AP left join ALUNOS A on A.IdAluno = AP.idaluno where extract(year from AP.Vencimento) = 2005 group by 1, 2
GOSTEI 0
Bruno Belchior
26/10/2005
fiz o seguinte:
SELECT A.IdTurma, EXTRACT(MONTH FROM (CASE WHEN pago = 0 THEN Vencimento ELSE DataPagamento END)) Mes, Coalesce(SUM(CASE WHEN pago = 1 THEN valorpago ELSE 0 END),0) TotalRecebido, Coalesce(SUM(CASE WHEN ap.pago = 0 THEN ap.valorbruto ELSE 0 END),0) TotalReceber, Coalesce((SELECT SUM(ap2.valorbruto) FROM alunosparcelas ap2 JOIN alunos a2 ON ap2.idaluno = a2.idaluno WHERE EXTRACT(MONTH FROM ap2.vencimento) = EXTRACT(MONTH FROM (CASE WHEN ap.pago = 0 THEN AP.Vencimento ELSE ap.DataPagamento END)) AND EXTRACT(YEAR FROM ap2.vencimento) = 2005 AND a2.idturma = a.idturma and AP2.IdProduto is null),0) ValorOriginal FROM AlunosParcelas AP JOIN ALUNOS A ON AP.IdAluno = A.IdAluno WHERE EXTRACT(YEAR FROM AP.Vencimento) = 2005 GROUP BY 1, 2
GOSTEI 0