CREATE TABLE Sales(Year INTEGER NOT NULL,
Quarter INTEGER NOT NULL,
Results INTEGER);
CREATE UNIQUE INDEX PK_IDX ON Sales(Year, Quarter) INCLUDE(Results);
ALTER TABLE Sales ADD PRIMARY KEY (Year, Quarter);
INSERT INTO Sales VALUES
(2004, 1, 20),
(2004, 2, 30),
(2004, 3, 15),
(2004, 4, 10),
(2005, 1, 18),
(2005, 2, 40),
(2005, 3, 12),
(2005, 4, 27);
The desired result is:
SELECT Year,
DECODE(Quarter, 1, Results) AS Q1,
DECODE(Quarter, 2, Results) AS Q2,
DECODE(Quarter, 3, Results) AS Q3,
DECODE(Quarter, 4, Results) AS Q4
FROM Sales;
YEAR Q1 Q2 Q3 Q4
----------- ----------- ----------- ----------- -----------
2004 20 - - -
2004 - 30 - -
2004 - - 15 -
2004 - - - 10
2005 18 - - -
2005 - 40 - -
2005 - - 12 -
2005 - - - 27
8 record(s) selected.
Note how DECODE injects NULL as an implicit ELSE.
SELECT Year,
MAX(DECODE(Quarter, 1, Results)) AS Q1,
MAX(DECODE(Quarter, 2, Results)) AS Q2,
MAX(DECODE(Quarter, 3, Results)) AS Q3,
MAX(DECODE(Quarter, 4, Results)) AS Q4
FROM Sales
GROUP BY Year;
YEAR Q1 Q2 Q3 Q4
----------- ----------- ----------- ----------- -----------
2004 20 30 15 10
2005 18 40 12 27
2 record(s) selected.
I noted above that this approach is the best. How do I know. Well let's look at the access plan: