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

Oracle स्ट्रिंग एकत्रीकरण

मैं यह मानने जा रहा हूं कि 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 की प्राथमिकता के साथ सब कुछ प्राप्त करें और उन्हें एकत्र करें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल 11 जी में असीमित अक्षर कैसे स्टोर करते हैं?

  2. मैं Oracle पर SQL का उपयोग करके चालू वर्ष कैसे प्राप्त करूं?

  3. पीएल/एसक्यूएल संग्रहित प्रो में अल्पविराम से अलग स्ट्रिंग को विभाजित करना

  4. .पैच_स्टोरेज

  5. ओरेकल ईबीएस पासवर्ड समाप्ति/नीति/सेटिंग्स पर उपयोगी प्रश्न