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.

Était-ce utile?

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
scroll top