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

एसक्यूएल डेवलपर ओरेकल का उपयोग कर गतिशील पिवट क्वेरी

आप सही रास्ते पर हैं लेकिन वह मामला तब विफल हो जाता है जब कम से कम एक छात्र के लिए एक से अधिक कक्षाएं निर्धारित की जाती हैं। एक ROW_NUMBER() विश्लेषणात्मक कार्य इस मुद्दे को हल करता है। तो, SYS_REFCURSOR . सहित एक संग्रहित फ़ंक्शन बनाएं :

CREATE OR REPLACE FUNCTION get_student_rs RETURN SYS_REFCURSOR IS
  recordset SYS_REFCURSOR;
  sqlqry    VARCHAR2(32767);
  cols      VARCHAR2(32767);
BEGIN
  SELECT LISTAGG(''''||name||''' AS "'||name||'"' ,',') WITHIN GROUP (ORDER BY 0)
    INTO cols
    FROM ( SELECT DISTINCT name FROM Students );  

  sqlqry :=
  'SELECT *
     FROM 
     (
      SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY 0) AS rn,
             s.*             
        FROM Students s     
      )
    PIVOT (
           MAX(class) FOR name IN ('||cols||')
           )
    ORDER BY rn';

  OPEN recordset FOR sqlqry;
  RETURN recordset;
END;
/

मान लें कि एक और रिकॉर्ड डाला गया है;

Name     School    Class
----     ------    -------
Jim      Hs        History

फिर आह्वान करें

VAR rc REFCURSOR
EXEC :rc := get_student_rs;
PRINT rc

एसक्यूएल डेवलपर . से की कमांड लाइन परिणाम सेट देखने के लिए जो होगा:

RN  SCHOOL  Jim      John     Matthew  Steve
--  ------  -------  -------  -------  ------
1   Hs      Maths    English  Science  Maths
2   Hs      History 

    



  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:TNS:निर्दिष्ट कनेक्ट पहचानकर्ता को हल नहीं कर सका?

  2. NHibernate और मोनो के साथ Oracle क्लाइंट ब्लॉब 10K सीमा?

  3. स्तंभ के डिफ़ॉल्ट मान को संशोधित करने के लिए तालिका बदलें

  4. प्रदर्शन ट्यूनिंग भूलभुलैया

  5. कार्यबल हेडकाउंट की त्रैमासिक गणना की क्षमता