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

Oracle10G SQL :कॉलम को पंक्तियों में बदलना

अगर आप 11G पर थे तो आप unpivot :

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT * FROM tablea
    UNPIVOT (percentage FOR subject IN (math, science, computer))
)
GROUP BY subject
ORDER BY subject;

SUBJECT  PERCENTAGE
-------- ----------
COMPUTER      94.33
MATH          91.33
SCIENCE       87.33

लेकिन चूंकि आप नहीं हैं, आप इसे नकली बना सकते हैं। इस साइट :

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT DECODE(unpivot_row, 1, 'Math',
                               2, 'Science',
                               3, 'Computer') AS subject,
           DECODE(unpivot_row, 1, math,
                               2, science,
                               3, computer) AS percentage
    FROM tablea
    CROSS JOIN (SELECT level AS unpivot_row FROM dual CONNECT BY level <= 3)
)
GROUP BY subject
ORDER BY subject;

SUBJECT  PERCENTAGE
-------- ----------
Computer      94.33
Math          91.33
Science       87.33

दोनों ही मामलों में, आंतरिक select पंक्तियों को स्तंभों में बदल रहा है; 10g में आपको बस इसे स्वयं करना है। SELECT ... CONNECT BY ... बस डमी मूल्यों की एक सूची उत्पन्न करता है, और इसमें आपके द्वारा पंक्तियों में परिवर्तित किए जा रहे स्तंभों की संख्या को कवर करने के लिए पर्याप्त होना चाहिए (और यदि आपके पास वास्तव में 1000 हैं, तो आपको वास्तव में डेटा मॉडल पर फिर से जाना चाहिए)। दो decode कथन उस जनरेट की गई संख्या का उपयोग स्तंभ नाम और मान से मेल खाने के लिए करते हैं - आंतरिक चयन को अपने आप चलाएँ ताकि यह देखा जा सके कि यह कैसा दिखता है।

डायनेमिक SQL का सहारा लिए बिना, आप कॉलम को सूचीबद्ध करने से दूर नहीं हो सकते - केवल एक बार वास्तविक unpivot के साथ , लेकिन दो बार नकली 10g संस्करण के साथ, और आपको यह सुनिश्चित करना होगा कि वे ठीक से मेल खाते हैं, और यह कि पंक्ति संख्या जनरेटर पर्याप्त मान उत्पन्न कर रहा है। (बहुत अधिक और आपको विषम परिणाम मिल सकते हैं, लेकिन जैसा कि कोई अतिरिक्त मान यहां शून्य होगा और आप avg का उपयोग कर रहे हैं , इस मामले में यह बहुत ज्यादा मायने नहीं रखता; एक विवेक जांच के रूप में आपको शायद इसे वैसे भी बिल्कुल मेल खाना चाहिए)।

या कोई अन्य संस्करण, आप पर आधारित name . को छोड़कर हमेशा सभी कॉलम चाहते हैं , जिसका अर्थ है कि आपको केवल उन स्तंभों को सूचीबद्ध करने की आवश्यकता है जो आप चाहते हैं और उन्हें नेत्रहीन रूप से मिलान करना आसान है - बस when जोड़ते रहें खंड; और आपको पंक्ति गणना की आवश्यकता नहीं है:

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT column_name AS subject,
        CASE
            WHEN column_name = 'MATH' then math
            WHEN column_name = 'SCIENCE' then science
            WHEN column_name = 'COMPUTER' then computer
        END AS percentage
    FROM tablea
    CROSS JOIN (
        SELECT column_name
        FROM user_tab_columns
        WHERE table_name = 'TABLEA'
        AND column_name != 'NAME'
    )
)
GROUP BY subject
ORDER BY subject;

SUBJECT                        PERCENTAGE
------------------------------ ----------
COMPUTER                            94.33
MATH                                91.33
SCIENCE                             87.33



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.security.AccessControlException:एक्सेस अस्वीकृत (java.security.SecurityPermission authProvider.SunMSCAPI)

  2. SEC_CASE_SENSITIVE_LOGON 12c . में बहिष्कृत

  3. उपयोगकर्ता-परिभाषित प्रकार के बारे में जानकारी कैसे प्राप्त करें?

  4. मैं 5 टेबल से एकाधिक मान कैसे चुन सकता हूं?

  5. SQL कथन द्वारा क्रम पर दायाँ कोष्ठक गुम है