OracleのPIVOT

PIVOT または UNPIVOT を使わなくてはならない状況は、
データ設計に問題があると思う。
よってどうしても不慣れであった。
Oracle のPIVOTは、以下の書式で書くことになっていて
PIVOT(集約関数 FOR 集約条件列 IN(集約条件値1 as 集約後列名1,
集約条件値2 as 集約後列名2,
集約条件値3 as 集約後列名3))

しかも対象テーブル集約は、暗黙のGROUP BY であって、
PIVOT( MAX(列名) OVER( PARTITION BY ~) のように、任意 GROUP BY にしたくても、
OVER句の使用がここでは許されていない。
PIVOT による集約はかなり限定されてしまう。

以下、サンプル

WITH sales AS (
    SELECT ' ' AS SCODE, ' ' AS ITEM, 0 AS SALE_NUM FROM dual WHERE 1=0
    UNION ALL SELECT '01','みかん',10 FROM dual
    UNION ALL SELECT '01','バナナ',12 FROM dual
    UNION ALL SELECT '01','レモン',16 FROM dual
    UNION ALL SELECT '02','みかん',18 FROM dual
    UNION ALL SELECT '02','バナナ',25 FROM dual
    UNION ALL SELECT '02','レモン',11 FROM dual
    UNION ALL SELECT '03','みかん',5 FROM dual
    UNION ALL SELECT '03','バナナ',2 FROM dual
    UNION ALL SELECT '03','レモン',7 FROM dual
    UNION ALL SELECT '02','バナナ',10 FROM dual
    UNION ALL SELECT '02','レモン',23 FROM dual
)
SELECT SCODE, ORANGE_NUM, BANANA_NUM, LEMON_NUM
FROM sales
PIVOT (
       MAX(SALE_NUM)
       FOR ITEM IN ('みかん' AS ORANGE_NUM
                   ,'バナナ' AS BANANA_NUM
                   ,'レモン' AS LEMON_NUM )
       )

結果は、

SCODE ORANGE_NUM BANANA_NUM LEMON_NUM
03 5 2 7
01 10 12 16
02 18 25 23