基本上你可以使用这样一个包含条件聚合逻辑的静态解决方案
SELECT id,
MAX(CASE WHEN rn = 1 THEN State_Assign END) AS sa1,
MAX(CASE WHEN rn = 2 THEN State_Assign END) AS sa2,
.......
.......
COUNT(*) AS total
FROM (SELECT s.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY 0) AS rn
FROM sampledata s)
GROUP BY id
ORDER BY id
可能会创建一个存储函数来生成 select 语句,该语句将根据表的当前值产生动态结果,例如
CREATE OR REPLACE FUNCTION Get_Pivoted_States RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_cols VARCHAR2(32767);
BEGIN
SELECT LISTAGG('MAX(CASE WHEN rn = '||rn||' THEN State_Assign END) AS sa'||rn ,',')
WITHIN GROUP (ORDER BY 0)
INTO v_cols
FROM (SELECT DISTINCT ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS rn
FROM sampledata);
v_sql :='SELECT id,
'|| v_cols ||',
COUNT(*) AS total
FROM (SELECT s.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY 0) AS rn
FROM sampledata s)
GROUP BY id
ORDER BY id';
OPEN v_recordset FOR v_sql;
DBMS_OUTPUT.PUT_LINE(v_sql);
RETURN v_recordset;
END;
/
该函数可以从 SQL Developer 的控制台调用
SQL> DECLARE
result SYS_REFCURSOR;
BEGIN
:result := Get_Pivoted_States;
END;
/
SQL> PRINT result;