आपको गतिशील कॉलम परिभाषा के साथ एक PIVOT फ़ंक्शन की आवश्यकता है। सबसे आसान तरीका है पिवट एक्सएमएल:
create table tst_data (id int primary key, source varchar2(255));
insert into tst_data values (1, 'INTERNET');
insert into tst_data values (2, 'DEMO');
insert into tst_data values (3, 'INTERNET');
insert into tst_data values (4, 'SALES');
insert into tst_data values (5, 'INTERNET');
insert into tst_data values (6, 'DEMO');
insert into tst_data values (7, 'INTERNET');
insert into tst_data values (8, 'COM');
commit;
select * from (
select source from tst_data
)
pivot xml
(
count(1)
for source in (select distinct t.source from tst_data t)
)
आपको XML डेटा संसाधित करने की आवश्यकता के बाद:
<PivotSet>
<item>
<column name = "SOURCE">COM</column>
<column name = "COUNT(1)">1</column>
</item>
<item>
<column name = "SOURCE">DEMO</column>
<column name = "COUNT(1)">2</column>
</item>
<item>
<column name = "SOURCE">INTERNET</column>
<column name = "COUNT(1)">4</column>
</item>
<item>
<column name = "SOURCE">SALES</column>
<column name = "COUNT(1)">1</column>
</item>
</PivotSet>
PIVOT XML
डायनामिक कॉलम परिभाषा का समर्थन करता है (for source in (select distinct t.source from tst_data t)
) हालांकि यह एक्सएमएल डेटा देता है। Extractvalue
और xmltable
फ़ंक्शन सर्वर साइड पर XML से विशेष कॉलम को क्वेरी करने की अनुमति देते हैं लेकिन आपको पहले से फ़ील्ड नाम निर्दिष्ट करने होंगे। इसलिए मैं इसे क्लाइंट साइड पर पार्स करना चाहता हूं।
यदि आप डीबी-लेयर पर सब कुछ करना चाहते हैं तो एक और तरीका है। PIVOT
(एक्सएमएल नहीं) कॉलम नामों की आवश्यकता है for source in ('INTERNET', 'DEMO', 'COM', ...)
. ऐसी क्वेरी उत्पन्न करना और कर्सर . लौटाना संभव है ग्राहक पक्ष के लिए:
CREATE OR REPLACE FUNCTION FUNCTION1 RETURN SYS_REFCURSOR AS
cur sys_refcursor;
BEGIN
open cur for 'select * from dual'; // generate PIVOT query here
RETURN cur;
END FUNCTION1;
मुझे कर्सर से (सर्वर साइड पर) एक साधारण बिना टाइप की क्वेरी बनाने की कोई विधि नहीं पता है, इसलिए यदि आप एक सादे SQL क्वेरी का उपयोग करना चाहते हैं तो इसे दो चरणों में करें:
- पीएल/एसक्यूएल फ़ंक्शन में नामित कॉलम के साथ एक पिवोट क्वेरी जेनरेट करें;
- अपने क्लाइंट से क्वेरी चलाएँ।