Reputation: 384
Table:
Id Month Value
T101 02/2020 3
T101 01/2020 5
T101 05/2020 4
T103 03/2020 7
T103 12/2020 10
T103 11/2019 16
Required:
Id DEC'19 JAN'20 FEB'20 MAR'20 APR'20 MAY'20
T101 0 5 3 0 0 4
T103 10 0 0 7 0 0
I need to get 6 months data (DEC'19-MAY'20)......Thanks in advance!!
Upvotes: 0
Views: 294
Reputation: 35900
You can use the conditional aggregation as follows:
SELECT id,
COALESCE(CASE WHEN MONTH = ADD_MONTHS(TRUNC(SYSDATE,'MON'), - 5)
THEN value END), 0) as MONTH6,
COALESCE(CASE WHEN MONTH = ADD_MONTHS(TRUNC(SYSDATE,'MON'), - 4)
THEN value END), 0) as MONTH5,
....
COALESCE(CASE WHEN MONTH = TRUNC(SYSDATE,'MON')
THEN value END), 0) as CURRENT_MONTH,
FROM your_table
GROUP BY id
Note that I am considering that the MONTH
is the date column
Upvotes: 2
Reputation: 167774
You can use a PIVOT
(with COALESCE
to get the zero values):
SELECT ID,
COALESCE( "MAY'20", 0 ) AS "MAY'20",
COALESCE( "APR'20", 0 ) AS "APR'20",
COALESCE( "MAR'20", 0 ) AS "MAR'20",
COALESCE( "FEB'20", 0 ) AS "FEB'20",
COALESCE( "JAN'20", 0 ) AS "JAN'20",
COALESCE( "DEC'19", 0 ) AS "DEC'19"
FROM data
PIVOT (
SUM( value )
FOR Month IN (
DATE '2020-05-01' AS "MAY'20",
DATE '2020-04-01' AS "APR'20",
DATE '2020-03-01' AS "MAR'20",
DATE '2020-02-01' AS "FEB'20",
DATE '2020-01-01' AS "JAN'20",
DATE '2019-12-01' AS "DEC'19"
)
)
However, you will need to hardcode the date values.
So, for your sample data (assuming you are storing your Month date values as dates; if not then convert the literals to strings):
CREATE TABLE data ( Id, Month, Value ) AS
SELECT 'T101', DATE '2020-02-01', 3 FROM DUAL UNION ALL
SELECT 'T101', DATE '2020-01-01', 5 FROM DUAL UNION ALL
SELECT 'T101', DATE '2020-05-01', 4 FROM DUAL UNION ALL
SELECT 'T103', DATE '2020-03-01', 7 FROM DUAL UNION ALL
SELECT 'T103', DATE '2020-12-01', 10 FROM DUAL UNION ALL
SELECT 'T103', DATE '2019-11-01', 16 FROM DUAL;
This outputs:
ID | MAY'20 | APR'20 | MAR'20 | FEB'20 | JAN'20 | DEC'19 :--- | -----: | -----: | -----: | -----: | -----: | -----: T103 | 0 | 0 | 7 | 0 | 0 | 0 T101 | 4 | 0 | 0 | 3 | 5 | 0
db<>fiddle here
Upvotes: 1