Pergunta

Esta é uma questão geral de SQL, mas se você quiser saber que o banco de dados é Firebird.

Eu tenho esta tabela (simplificada):

tipo de valor do usuário
--------------------
john  25      credit
john  20      debit
john  5       debit
john  15      credit
mike  15      credit

Quero ter um resultado parecido com este, usando uma única consulta:

débito de crédito do usuário
--------------------
john  40      25
mike  15      NULL
Where credit = SUM(amount) WHERE type=credit
   and debit = SUM(amount) WHERE type=debit

Basicamente, quero ter vários campos no resultado com base na soma de um campo (neste caso, valor), mas em condições diferentes (neste caso, tipo).

Agradecemos antecipadamente por qualquer sugestão.

Foi útil?

Solução

SQL padrão seria:

SELECT "user",
    SUM(CASE WHEN type='credit' then amount END) as Credit,
    SUM(CASE WHEN type='debit' then amount END) as Debit
FROM
    "table"
GROUP BY
    "user"

Outras dicas

Não tenho certeza de como o Firebird faz isso, mas você pode fazer algo como:

SELECT user, 
sum(SELECT amount FROM table AS t2 WHERE t2.user = t1.user AND type="credit" ) AS credit, 
sum(SELECT amount FROM table AS t3 WHERE t3.user = t1.user AND type="debit" ) AS debit
FROM table AS t1
GROUP BY user
ORDER BY user

Estou me referindo ao que acho que seria no PostgreSQL, caso isso ajude você a encontrar o que precisa.

tente isto:

SELECT credit.user_name, credit.cre, debit.deb
  FROM (SELECT user_name, SUM(amount) cre FROM t WHERE TYPE = 'credit' GROUP BY user_name) credit
  LEFT OUTER JOIN (SELECT user_name, SUM(amount) deb
                     FROM t
                    WHERE TYPE = 'debit'
                    GROUP BY user_name) debit
    ON (credit.user_name = debit.user_name)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top