This question is similar, yet different, to another DBA SE question I have here: Group by NAME and YEAR, categorize NAME
I have a FINANCE_SOURCE
table:
+-----------+------------+-------------+--------+------+
| SOURCE_ID | PROJECT_ID | SOURCE_NAME | AMOUNT | YEAR |
+-----------+------------+-------------+--------+------+
| 101 | 1 | A | 10.00 | 2017 |
| 102 | 1 | B | 5.00 | 2017 |
| 103 | 1 | B | 15.00 | 2017 |
| 104 | 1 | B | 70.00 | 2016 |
| 105 | 1 | C | 30.00 | 2017 |
| 106 | 1 | D | 1.00 | 2016 |
| 107 | 1 | D | 20.00 | 2017 |
+-----------+------------+-------------+--------+------+
I want to rearrange the data, so that SOURCE_A
, SOURCE_B
, and OTHER
(anything that's not A
or B
) are in separate columns.
The data needs to be grouped into separate YEARS
:
+------------+---------+---------+-------------+-------+------+
| PROJECT_ID | A_TOTAL | B_TOTAL | OTHER_TOTAL | TOTAL | YEAR |
+------------+---------+---------+-------------+-------+------+
| 1 | 10 | 20 | 50 | 80 | 2017 |
| 1 | | 70 | 1 | 71 | 2016 |
+------------+---------+---------+-------------+-------+------+
How can I do this? Performance is important.
Best Answer
You can get it by using SUM(CASE...) statement.
dbfiddle here
As @JackDouglas has suggested, let me add his new solution that could be slightly quicker.
dbfiddle here
(Execution plan included.)