SQL - Où condition pour chaque colonne
-
09-09-2020 - |
Question
Il s'agit d'une question générale SQL, mais si vous devez savoir que la base de données est Firebird.
J'ai cette table (simplifiée):
user amount type -------------------- john 25 credit john 20 debit john 5 debit john 15 credit mike 15 credit
Je veux avoir un résultat qui ressemble à cela, en utilisant une seule requête:
user credit debit -------------------- john 40 25 mike 15 NULL
Where credit = SUM(amount) WHERE type=credit
and debit = SUM(amount) WHERE type=debit
Fondamentalement, je souhaite avoir plusieurs champs sur le résultat en fonction d'une somme d'un champ (dans ce cas de montant) mais sur différentes conditions (dans ce type de type).
Merci d'avance pour toute suggestion.
La solution
SQL standard serait:
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"
Autres conseils
Je ne sais pas comment Firebird le fait, mais pouvez-vous faire quelque chose comme:
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
Je référencement ce que je pense que ce serait dans PostgreSQL, au cas où vous vous aiderez à trouver ce dont vous avez besoin.
Essayez ceci:
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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow