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

Oracle 10g . पर पिवट करें

Oracle 10g में, कोई PIVOT नहीं था फ़ंक्शन लेकिन आप इसे CASE . के साथ समुच्चय का उपयोग करके दोहरा सकते हैं :

select usr,
  sum(case when tp ='T1' then cnt else 0 end) T1,
  sum(case when tp ='T2' then cnt else 0 end) T2,
  sum(case when tp ='T3' then cnt else 0 end) T3
from temp
group by usr;

डेमो के साथ SQL Fiddle देखें

यदि आपके पास Oracle 11g+ है तो आप PIVOT . का उपयोग कर सकते हैं समारोह:

select *
from temp
pivot
(
  sum(cnt)
  for tp in ('T1', 'T2', 'T3')
) piv

डेमो के साथ SQL Fiddle देखें

यदि आपके पास बदलने के लिए अज्ञात संख्या में मान हैं, तो आप इसका एक गतिशील संस्करण उत्पन्न करने के लिए एक प्रक्रिया बना सकते हैं:

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

    begin
        for x in (select distinct tp from temp order by 1)
        loop
            sql_query := sql_query ||
              ' , sum(case when tp = '''||x.tp||''' then cnt else 0 end) as '||x.tp;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from temp group by usr';

        open p_cursor for sql_query;
    end;
/

फिर कोड निष्पादित करने के लिए:

variable x refcursor
exec dynamic_pivot(:x)
print x

सभी संस्करणों का परिणाम समान है:

| USR | T1 | T2 | T3 |
----------------------
|   1 | 17 |  0 |  0 |
|   2 |  0 | 21 |  1 |
|   3 | 45 |  0 |  0 |

संपादित करें:आपकी टिप्पणी के आधार पर यदि आप Total चाहते हैं फ़ील्ड, सबसे आसान तरीका है कि क्वेरी को किसी अन्य SELECT . के अंदर रखा जाए इसके समान:

select usr,
  T1 + T2 + T3 as Total,
  T1,
  T2,
  T3
from
(
  select usr,
    sum(case when tp ='T1' then cnt else 0 end) T1,
    sum(case when tp ='T2' then cnt else 0 end) T2,
    sum(case when tp ='T3' then cnt else 0 end) T3
  from temp
  group by usr
) src;

डेमो के साथ SQL 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. Oracle डेटाबेस में PL/SQL फ़ंक्शंस का परिचय

  2. ऑरैकल में कॉलम संशोधित करें - कैसे जांचें कि कोई कॉलम शून्य करने योग्य होने से पहले शून्य है या नहीं?

  3. OracleParameter.Value को Int32 . में बदलें

  4. SQL क्वेरी के साथ Oracle स्कीमा आकार कैसे प्रदर्शित करें?

  5. Oracle SQL डेवलपर के साथ SYS के रूप में डेटाबेस में लॉग इन करने में असमर्थ