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 देखें