SQL - condição where para cada coluna
-
09-09-2020 - |
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.
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