สร้างมุมมอง Pivot ใน SQL จากตาราง SQL
ฉันมีตารางต่อไปนี้ TEMP
ฉันต้องการสร้างมุมมองเดือยโดยใช้ SQL เรียงลำดับโดยCATEGORYASC โดยLEVELDESC และSETASC และกรอกข้อมูลในไฟล์value.
ผลลัพธ์ที่คาดหวัง:
ฉันได้ลองใช้รหัสต่อไปนี้แล้ว แต่ไม่สามารถหาวิธีแก้ปัญหาส่วนที่รวมซึ่งทำให้เกิดข้อผิดพลาด
SELECT *
FROM
(SELECT
SET, LEVEL, CATEGORY, VALUE
FROM
TEMP
ORDER BY
CATEGORY ASC, LEVEL DESC, SET ASC) x
PIVOT
(value(VALUE) FOR RISK_LEVEL IN ('X','Y','Z') AND CATEGORY IN ('ABC', 'DEF', 'GHI', 'JKL')) p
นอกจากนี้ฉันต้องการทราบว่าอาจมีวิธีใดในการเพิ่มคอลัมน์แบบไดนามิกและมาถึงมุมมองนี้สำหรับตารางใด ๆ ที่มีคอลัมน์เดียวกัน (เพื่อให้สามารถหลีกเลี่ยงการเข้ารหัสได้)
ฉันรู้ว่าเราสามารถทำได้ใน Excel และเปลี่ยนรูปแบบได้ แต่ฉันต้องการให้ข้อมูลถูกเก็บไว้ในฐานข้อมูลในรูปแบบนี้
คำตอบ
อาจมีการสร้างฟังก์ชันที่เก็บไว้ ( หรือโพรซีเดอร์ ) เพื่อสร้าง SQL สำหรับ Dynamic Pivoting และชุดผลลัพธ์จะถูกโหลดลงในตัวแปรประเภท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;
ซึ่งฉันใช้สองระดับของการหมุนครั้งแรกอยู่ในแบบสอบถามภายในที่เกี่ยวข้องกับPIVOTClause และที่สองอยู่ในแบบสอบถามภายนอกที่มีตรรกะการรวมแบบมีเงื่อนไข แจ้งให้ทราบว่าคำสั่งของระดับควรอยู่ในลำดับถัดลงมา ( Z, Y, X) ภายในผลที่คาดหวังเป็นไปตามคำอธิบาย
แล้วเรียก
VAR rc REFCURSOR
EXEC :rc := Get_Categories_RS;
PRINT rc
จากบรรทัดคำสั่งของผู้พัฒนา SQL เพื่อให้ได้ชุดผลลัพธ์
คำหลัก Btw หลีกเลี่ยงการใช้ลิขสิทธิ์เช่นsetและlevelเช่นเดียวกับในกรณีของคุณ ฉันจำเป็นต้องเสนอราคาเพื่อให้สามารถใช้งานได้