एक विकल्प PIVOT
. का उपयोग करना होगा खंड
SELECT *
FROM (SELECT t1.*, t2.tipo, t2.valor
FROM table1 t1
JOIN table2 t2
ON t2.id = t1.id)
PIVOT
(
MAX(valor) FOR tipo IN ( 't1' AS "t1", 't2' AS "t2", 't3' AS "t3" )
)
लेकिन यह स्थिर है, उदा। tipo
. के लिए अलग-अलग मानों के रूप में अद्यतन करने की आवश्यकता है कॉलम जोड़ा जाता है। इसे गतिशील बनाने के लिए, आप एक फ़ंक्शन बना सकते हैं
CREATE OR REPLACE FUNCTION Get_Pivoted_Cols RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_cols VARCHAR2(32767);
BEGIN
SELECT LISTAGG( ''''||tipo||''' AS "'||tipo||'"' , ',' )
WITHIN GROUP ( ORDER BY tipo )
INTO v_cols
FROM ( SELECT DISTINCT tipo FROM table2 );
v_sql := 'SELECT *
FROM (SELECT t1.*, t2.tipo, t2.valor
FROM table1 t1
JOIN table2 t2
ON t2.id = t1.id)
PIVOT
(
MAX(valor) FOR tipo IN ( '|| v_cols ||' )
)';
OPEN v_recordset FOR v_sql;
RETURN v_recordset;
END;
/
और फिर
. का उपयोग करके कॉल करेंVAR rc REFCURSOR
EXEC :rc := Get_Pivoted_Cols;
PRINT rc
SQL डेवलपर के कंसोल से।