On 12-09-2012 23:28, Eduardo Almeida wrote:
> Olá senhores, alguma alma caridosa poderia me ajudar a resolver essa
> questão? Não precisa ser a solução, pode ser algo para leitura. Já quebrei
> cabeça aqui e não consigo chegar numa solução.
>
> Preciso somar todos os valores de uma coluna em circunstâncias diferentes na
> mesma cláusula SQL. Para retratar melhor minha necessidade, vou esboçar a
> soma abaixo através de duas cláusulas, vamos lá
>
>          SELECT SUM(total) as receitas_consolidadas
>          FROM tbl_financeiro_fluxo_de_caixa
>          WHERE id_conta = ? AND tipo_de_operacao = 'C' AND situacao =
> 'Recebido' AND date_part('month', data_do_recebimento) = 1
>          group by total, data_do_recebimento;
>
>          SELECT SUM(total) as despesas_liquidadas
>          FROM tbl_financeiro_fluxo_de_caixa
>          WHERE id_conta = ? AND tipo_de_operacao = 'D' AND situacao = 'Pago'
> AND date_part('month', data_do_pagamento) = 1
>          group by total, data_do_pagamento;
>
> Eu gostaria de otimizar isso e colocar tudo numa só cláusula.

SELECT SUM(total) as receitas_consolidadas, tipo_de_operacao, situacao
FROM tbl_financeiro_fluxo_de_caixa
WHERE
        id_conta = ? AND
        tipo_de_operacao in ('C', 'D') AND
        situacao in ( 'Recebido', 'Pago') AND
        date_part('month', data_do_recebimento) = 1
GROUP BY tipo_de_operacao, situacao;

Não entendi a dificuldade. Será que entendi sua pergunta corretamente?
Vê se é isso...
Aliás, sua consulta original tem erro. Você não deve agrupar por total 
porque é a coluna que você tá consolidando. E não dá pra agrupar por 
data_do_recebimento porque não tá listada no SELECT, aí seu date_part 
não servirá pra muita coisa também.

Dá pra escrever de outras formas também.

SELECT SUM(total) as receitas_consolidadas, tipo_de_operacao, situacao
FROM tbl_financeiro_fluxo_de_caixa
WHERE
        id_conta = ? AND
        (tipo_de_operacao = 'C' OR tipo_de_operacao = 'D') AND
        (situacao = 'Recebido' OR situacao = 'Pago') AND
        date_part('month', data_do_recebimento) = 1
GROUP BY tipo_de_operacao, situacao;

Dá na mesma. Ah, troca a ordem das colunas no SELECT... que fica mais 
legível. Pode dar ORDER BY no tipo_de_operacao e situacao pra juntar 
mais bonitinho também.

[]s

__________________________________
Flavio Henrique A. Gurgel
Líder de Projetos Especiais
Consultoria, Projetos & Treinamentos 4LINUX
Tel1: +55-11.2125-4747 ou 2125-4748
www.4linux.com.br
email: fla...@4linux.com.br
______________________________
FREE SOFTWARE SOLUTIONS
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a