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

Oracle डायनेमिक पिवोटिंग

परिणाम के लिए गतिशील एसक्यूएल का उपयोग करना जहां निष्पादन के समय कॉलम अज्ञात हैं, कुछ अन्य आरडीएमबीएस की तुलना में ओरेकल में थोड़ी परेशानी है।

चूंकि आउटपुट के लिए रिकॉर्ड प्रकार अभी तक अज्ञात है, इसे पहले से परिभाषित नहीं किया जा सकता है।

Oracle 11g में, एक तरीका एक अनाम प्रक्रिया का उपयोग करना है जो पिवट परिणाम के साथ एक अस्थायी तालिका उत्पन्न करता है।

फिर उस अस्थायी तालिका से परिणाम चुनें।

declare
  v_sqlqry clob;
  v_cols clob;
begin
  -- Generating a string with a list of the unique names
  select listagg(''''||CCL||''' as "'||CCL||'"', ', ') within group (order by CCL)
  into v_cols
  from 
  (
    select distinct CCL
    from tableA
  );

  -- drop the temporary table if it exists
  EXECUTE IMMEDIATE 'DROP TABLE tmpPivotTableA';
  EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF;

  -- A dynamic SQL to create a temporary table 
  -- based on the results of the pivot
  v_sqlqry := '
    CREATE GLOBAL TEMPORARY TABLE tmpPivotTableA
    ON COMMIT PRESERVE ROWS AS
    SELECT * 
    FROM (SELECT ID, CCL, Flag FROM TableA) src 
    PIVOT (MAX(Flag) FOR (CCL) IN ('||v_cols||')) pvt';

  -- dbms_output.Put_line(v_sqlqry); -- just to check how the sql looks like
  execute immediate v_sqlqry;

end;
/

select * from tmpPivotTableA;

रिटर्न:

ID  adam john rob terry
--  ---- ---- --- -----
1   x    x    x
2        x      

आप db<>fiddle यहां . पर एक परीक्षण पा सकते हैं

Oracle 11g में, उपयोग की जाने वाली एक और बढ़िया ट्रिक (एंटोन शेफर द्वारा बनाई गई) इस ब्लॉग में पाई जा सकती है। लेकिन आपको इसके लिए पिवट फ़ंक्शन जोड़ना होगा।
स्रोत कोड इस ज़िप में पाया जा सकता है

उसके बाद SQL इस तरह सरल हो सकता है:

select * from 
table(pivot('SELECT ID, CCL, Flag FROM TableA'));

आपको db<>fiddle पर एक परीक्षण मिलेगा



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कॉमा के साथ स्ट्रिंग्स में शामिल होने के लिए ओरेकल एग्रीगेट, और कस्टम एग्रीगेट लिखने के बारे में

  2. कैसे Oracle में नियमित अभिव्यक्ति से समूह निकालने के लिए?

  3. पिछले महीने की सभी तिथियों को सूचीबद्ध करने के लिए ओरेकल एसक्यूएल क्वेरी

  4. Oracle D2k, Oracle प्रपत्र 10g, Oracle प्रपत्र 6i . में अनुलग्नकों के साथ ईमेल भेजें

  5. Oracle 11g के साथ XML तालिका