चूंकि आप 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 |