Pregunta

Esta es una pregunta general de SQL, pero i si debe saber que la base de datos es Firebird.

Tengo esta tabla (simplificada):

user  amount  type
--------------------
john  25      credit
john  20      debit
john  5       debit
john  15      credit
mike  15      credit

Quiero tener un resultado que se vea así, usando una sola consulta:

user  credit  debit
--------------------
john  40      25
mike  15      NULL
Where credit = SUM(amount) WHERE type=credit
   and debit = SUM(amount) WHERE type=debit

Básicamente quiero tener varios campos en el resultado basados en una suma de un campo (en este caso) pero en diferentes condiciones (en este tipo de caso).

Gracias de antemano por cualquier sugerencia.

¿Fue útil?

Solución

SQL estándar sería:

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"

Otros consejos

No estoy seguro de cómo lo hace Firebird, pero puedes hacer algo así:

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

Estoy haciendo referencia a lo que creo que estaría en PostgreSQL, en caso de que lo ayude a encontrar lo que necesita.

Intenta esto:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top