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

ओरेकल:डायनामिक कॉलम नाम

चूंकि आप Oracle10g का उपयोग कर रहे हैं, इसलिए कोई PIVOT नहीं है फ़ंक्शन इसलिए आपको एक CASE . के साथ एक समग्र फ़ंक्शन का उपयोग करके इस प्रकार का परिवर्तन करना होगा बयान।

यदि मान समय से पहले से ज्ञात हैं, तो आप उन्हें स्थिर संस्करण में हार्ड कोड कर सकते हैं:

select s.ts_location,
  sum(case when p.tp_name = 'apple' then s.ts_sales else 0 end) Apple,
  sum(case when p.tp_name = 'mango' then s.ts_sales else 0 end) Mango,
  sum(case when p.tp_name = 'pineapple' then s.ts_sales else 0 end) Pineapple
from tbl_sales s
inner join tbl_products p
  on s.ts_tp_id = p.tp_id
group by s.ts_location

देखें SQL Fiddle with Demo

लेकिन अगर आप समय से पहले मूल्य ज्ञात नहीं हैं, तो आपको गतिशील एसक्यूएल लागू करना होगा और ओरेकल में आप इसके लिए एक प्रक्रिया का उपयोग करना चाहेंगे:

CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select s.ts_location ';

    begin
        for x in (select distinct tp_name from tbl_products order by 1)
        loop
            sql_query := sql_query ||
                ' , sum(case when p.tp_name = '''||x.tp_name||''' then s.ts_sales end) as '||x.tp_name;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from tbl_sales s 
                                                inner join tbl_products p
                                                  on s.ts_tp_id = p.tp_id
                                                group by s.ts_location';
        dbms_output.put_line(sql_query);

        open p_cursor for sql_query;
    end;
/

फिर उन परिणामों को वापस करने के लिए जिनका आप उपयोग कर सकते हैं (नोट: मैं इसे टॉड में इस तरह से करता हूं):

variable x refcursor
exec dynamic_pivot(:x)
print x

दोनों परिणाम लौटाएंगे:

| TS_LOCATION | APPLE | MANGO | PINEAPPLE |
-------------------------------------------
|          LN |     0 |    10 |        35 |
|          QL |    25 |     0 |        20 |
|          NY |   100 |     5 |        50 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Row_Number के साथ SQL क्वेरी, क्लॉज द्वारा और कहां ऑर्डर करें

  2. क्या एक इन्सर्ट ऑपरेशन एक और डीडीएल ऑपरेशन प्रतीक्षा कर सकता है?

  3. Oracle में LPAD () फ़ंक्शन

  4. पीएल/एसक्यूएल ब्लॉक समस्या:कोई डेटा त्रुटि नहीं मिली

  5. आदेशित परिणाम सेट से पंक्तियों का 'रन' ढूँढना