ストアド関数(またはプロシージャ )動的ピボット用のSQLを作成するために作成される場合があり、結果セットはタイプSYS_REFCURSOR
の変数にロードされます。 :
CREATE OR REPLACE FUNCTION Get_Categories_RS RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_cols_1 VARCHAR2(32767);
v_cols_2 VARCHAR2(32767);
BEGIN
SELECT LISTAGG( ''''||"level"||''' AS "'||"level"||'"' , ',' )
WITHIN GROUP ( ORDER BY "level" DESC )
INTO v_cols_1
FROM (
SELECT DISTINCT "level"
FROM temp
);
SELECT LISTAGG( 'MAX(CASE WHEN category = '''||category||''' THEN "'||"level"||'" END) AS "'||"level"||'_'||category||'"' , ',' )
WITHIN GROUP ( ORDER BY category, "level" DESC )
INTO v_cols_2
FROM (
SELECT DISTINCT "level", category
FROM temp
);
v_sql :=
'SELECT "set", '|| v_cols_2 ||'
FROM
(
SELECT *
FROM temp
PIVOT
(
MAX(value) FOR "level" IN ( '|| v_cols_1 ||' )
)
)
GROUP BY "set"
ORDER BY "set"';
OPEN v_recordset FOR v_sql;
RETURN v_recordset;
END;
ここでは、2つのレベルのピボットを使用しました。1つ目は、PIVOT
を含む内部クエリ内にあります。 節、および2番目は、条件付き集計ロジックを持つ外部クエリにあります。レベルの順序は降順である必要があることに注意してください(Z
、Y
、X
)説明に準拠していると予想される結果の範囲内。
そして、呼び出します
VAR rc REFCURSOR
EXEC :rc := Get_Categories_RS;
PRINT rc
結果セットを取得するためにSQLDeveloperのコマンドラインから
ところで、set
などの予約キーワードの使用は避けてください およびlevel
あなたの場合のように。使用できるようにするには、引用する必要がありました。