Table TRANSACTION:
| TRANS_VALUE | USER ID | TRANS_TYPE_ID |
|---|---|---|
| 10 | 1 | 2 |
| 5 | 2 | 1 |
| 15 | 1 | 1 |
| 20 | 2 | 2 |
| 10 | 1 | 2 |
| 5 | 1 | 2 |
| 15 | 3 | 1 |
| 20 | 3 | 1 |
I need to get to this:
| USER | SUM(TRANS_TYPE_1) | SUM(TRANS_TYPE_2) |
|---|---|---|
| 1 | 15 | 25 |
| 2 | 5 | 20 |
| 3 | 35 | NULL |
Can someone help me?
I tried this but sadness
SELECT
user_id AS "USER
SUM(trans_value)
FROM
TRANSACTION
WHERE
trans_value = 1
GROUP BY
user_id
ORDER BY 1;
I need to get to this
| USER | SUM(TRANS_TYPE_1) | SUM(TRANS_TYPE_2) |
|---|---|---|
| 1 | 15 | 25 |
| 2 | 5 | 20 |
| 3 | 35 | NULL |
>Solution :
Use conditional aggregation:
SELECT user_id,
SUM(CASE trans_type_id WHEN 1 THEN trans_value END) AS sum_trans_type_1,
SUM(CASE trans_type_id WHEN 2 THEN trans_value END) AS sum_trans_type_2
FROM transaction
GROUP BY user_id
or PIVOT:
SELECT *
FROM transaction
PIVOT (
SUM(trans_value)
FOR trans_type_id IN (
1 AS sum_trans_type_1,
2 AS sum_trans_type_2
)
)
Which, for the sample data:
CREATE TABLE transaction (TRANS_VALUE, USER_ID, TRANS_TYPE_ID) AS
SELECT 10, 1, 2 FROM DUAL UNION ALL
SELECT 5, 2, 1 FROM DUAL UNION ALL
SELECT 15, 1, 1 FROM DUAL UNION ALL
SELECT 20, 2, 2 FROM DUAL UNION ALL
SELECT 10, 1, 2 FROM DUAL UNION ALL
SELECT 5, 1, 2 FROM DUAL UNION ALL
SELECT 15, 3, 1 FROM DUAL UNION ALL
SELECT 20, 3, 1 FROM DUAL;
Both output:
| USER_ID | SUM_TRANS_TYPE_1 | SUM_TRANS_TYPE_2 |
|---|---|---|
| 1 | 15 | 25 |
| 2 | 5 | 20 |
| 3 | 35 | null |