SQL - Donde la condición para cada columna
-
09-09-2020 - |
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.
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