अगर आप 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