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

एसक्यूएल में एक ही पंक्ति में विभिन्न मानों वाले कॉलम के बारे में कैसे जाना है?

तालिका डिजाइन पर पिछली टिप्पणियों के संबंध में - वास्तव में, तालिका में एक अतिरेक है; आप empname को किसी अन्य तालिका में संग्रहीत कर सकते हैं, जिससे बचने के लिए आप यहां अपनी तालिका से जुड़ेंगे; प्रत्येक अतिरेक एक संभावित विरोधाभास है। हालांकि, यदि हमारे पास आवश्यक जोड़ को क्वेरी करने और न्यूनतम करने के लिए अनुकूलित तालिका डिज़ाइन है, तो इसे कहीं और से बैच नौकरी में भर दिया जा सकता है, और फिर डिज़ाइन उपयुक्त होगा।

आप यहां जो करना चाहते हैं उसे अक्सर 'क्षैतिज पिवटिंग' के रूप में जाना जाता है। हमारे यहां कुछ जानकारी की कमी है, इसलिए मैं अधिकतम 2 ऋण मान रहा हूं। हमें एक तंत्र की आवश्यकता है जो हमें col1 या col2 में डेटा डालने की अनुमति देता है, इस पर निर्भर करता है कि यह उसी एम्पनो के लिए पहली या दूसरी पंक्ति है या नहीं। इसलिए हम एक अनुक्रम संख्या उत्पन्न करते हैं। अंत में, हम पंक्तियों की संख्या को कम करने और तालिका को समतल करने के लिए GROUP BY के संयोजन में SUM(CASE seq WHEN...) व्यंजक का उपयोग करते हैं।

ये रहा:

-- first global table expression - the input table
-- The table could exist already, and then this would not be needed.
WITH foo(empno,empname,loanref,amount) AS (
          SELECT  1,'abc',123,100
UNION ALL SELECT  1,'abc',456,200
)
-- second global table expression - add sequence number
-- this needs to be in the query
,    foo_numbered AS (
SELECT
  -- need a number: 1 for the first, 2 for the second loan
  ROW_NUMBER() OVER(PARTITION BY empname ORDER BY loanref) AS seq
, *
FROM foo
)
SELECT
  empno
, empname
, MAX(CASE seq WHEN 1 THEN loanref END) AS loanref_1
, SUM(CASE seq WHEN 1 THEN amount END) AS amount_1
, MAX(CASE seq WHEN 2 THEN loanref END) AS loanref_2
, SUM(CASE seq WHEN 2 THEN amount END) AS amount_2
FROM foo_numbered
GROUP BY
  empno
, empname
;

हैप्पी प्लेइंग

मार्को




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या मुझे Oracle में प्राथमिक कुंजी कॉलम को अनुक्रमित करना चाहिए

  2. ORACLE 2 हैंगिंग लेफ्ट जॉइन के साथ LITERAL का उपयोग करके बाहरी जॉइन पर विधेय के लिए LEFT अधिकांश तालिका से पंक्ति को बाहर करता है

  3. डेटाबेस पैचसेट प्राप्त करें

  4. डेटाटेबल से OracleDataAdapter का उपयोग करके Oracle तालिका में रिकॉर्ड अपडेट और सम्मिलित करें

  5. OracleConnection से खोलना