मैं यह मानने जा रहा हूं कि PRIORITY
कॉलम हमेशा 1 होता है जब "मुख्य उत्पाद" होता है और कभी भी 1 नहीं होता है। आपके डेटा से यह भी लगता है कि प्रत्येक ग्राहक के पास केवल एक "मुख्य" उत्पाद है। मैं यह मानने जा रहा हूं कि यह सच है। यदि ऐसा नहीं है तो आपके पास उत्पाद समूहों में अंतर करने के लिए एक और कॉलम होना चाहिए। आप इसे बस नीचे में जोड़ सकते हैं।
जटिल/कुशल उत्तर इस प्रकार हो सकता है:
select customer
, max(product) keep (dense_rank first order by priority) as main_product
, listagg(case when priority = 2 then product end, ', ')
within group (order by product) as sub_product
from products
group by customer
एसक्यूएल फिडल
प्रति ग्राहक, PRODUCT
कॉलम मानता है कि प्रत्येक ग्राहक के पास मुख्य उत्पाद होता है, फिर प्राथमिकता के क्रम में पहला उत्पाद प्राप्त होता है। दूसरा कॉलम केवल वहीं लेता है जहां प्राथमिकता 2 है और आपके मानों को एक साथ जोड़ने के लिए स्ट्रिंग कॉन्सटेनेशन फ़ंक्शन LISTAGG() का उपयोग करता है।
मैं KEEP क्लॉज के बारे में Rob van Wijk के ब्लॉग पोस्ट की अत्यधिक अनुशंसा करता हूँ।
एक अधिक मानक SQL समाधान इस तरह दिखेगा:
select a.customer, a.product as main_product
, listagg(b.product, ', ') within group (order by b.product) as sub_product
from products a
join products b
on a.customer = b.customer
where a.priority = 1
and b.priority = 2
group by a.customer, a.product
यानी वह सब कुछ ढूंढें जिसकी प्राथमिकता 1 है, इसका उपयोग अपनी दो पंक्तियों को उत्पन्न करने के लिए करें और फिर 2 की प्राथमिकता के साथ सब कुछ प्राप्त करें और उन्हें एकत्र करें।