Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

SQL तालिका से SQL में पिवट दृश्य बनाएं

एक संग्रहीत कार्य (या प्रक्रिया ) डायनेमिक पिवोटिंग के लिए 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 डेवलपर की कमांड लाइन से

बीटीडब्ल्यू, आरक्षित कीवर्ड जैसे set . का उपयोग करने से बचें और level जैसा कि आपके मामले में है। उपयोग करने में सक्षम होने के लिए मुझे उन्हें उद्धृत करने की आवश्यकता थी।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-12154 निर्दिष्ट कनेक्ट पहचानकर्ता को हल नहीं कर सका

  2. X64 में WebDev.WebServer.exe (VS वेब सर्वर) का उपयोग कैसे करें?

  3. Oracle:यदि कोई पंक्ति मौजूद नहीं है तो INSERT कैसे करें

  4. अंतराल को मिनटों में बदलें

  5. Oracle में टाइमस्टैम्प कैसे डालें?