SQL तालिका से SQL में धुरी दृश्य बनाएँ
मेरे पास निम्न तालिका है TEMP
मैं एसक्यूएल, डीएससी और एएससी CATEGORYद्वारा आदेशित और भरने के साथ एक धुरी दृश्य बनाना चाहता हूं ।LEVELSETvalue
अपेक्षित उत्पादन:
मैंने निम्नलिखित कोड की कोशिश की है लेकिन एक समग्र भाग को प्राप्त करने में असमर्थ है जो एक त्रुटि फेंक रहा है:
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
इसके अलावा मैं जानना चाहता हूं कि क्या स्तंभों को गतिशील रूप से जोड़ने और किसी भी तालिका के लिए इस दृश्य पर पहुंचने के लिए कोई भी तरीका हो सकता है जिसमें समान कॉलम हों (ताकि हार्डकोडिंग से बचा जा सके)।
मुझे पता है कि हम एक्सेल में यह कर सकते हैं और इसे स्थानांतरित कर सकते हैं, लेकिन मैं चाहता हूं कि डेटा को इस प्रारूप में डीबी में संग्रहीत किया जाए।
जवाब
डायनामिक पिविंग के लिए 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;
जिसमें मैंने दो स्तरों का उपयोग किया है: पहला PIVOTक्लॉज को शामिल करने वाली आंतरिक क्वेरी के भीतर है , और दूसरा बाहरी क्वेरी में सशर्त एकत्रीकरण तर्क है। सूचना है कि स्तरों के क्रम अवरोही क्रम (में होना चाहिए Z, Y, X) विवरण के अनुरूप के रूप में अपेक्षित परिणाम के भीतर।
और फिर आह्वान करें
VAR rc REFCURSOR
EXEC :rc := Get_Categories_RS;
PRINT rc
परिणाम सेट करने के लिए SQL डेवलपर की कमांड लाइन से
Btw, आरक्षित खोजशब्दों जैसे setऔर levelआपके मामले में उपयोग करने से बचें । उपयोग करने में सक्षम होने के लिए मुझे उन्हें उद्धृत करने की आवश्यकता थी।