MySQL पिवट: पंक्तियों को कॉलम में घुमाना

Mysql Pivot Rotating Rows Columns



एक डेटाबेस तालिका विभिन्न प्रकार के डेटा को स्टोर कर सकती है और कभी-कभी हमें पंक्ति-स्तरीय डेटा को कॉलम-स्तरीय डेटा में बदलने की आवश्यकता होती है। PIVOT () फ़ंक्शन का उपयोग करके इस समस्या को हल किया जा सकता है। इस फ़ंक्शन का उपयोग किसी तालिका की पंक्तियों को स्तंभ मानों में घुमाने के लिए किया जाता है। लेकिन यह फ़ंक्शन बहुत कम डेटाबेस सर्वरों द्वारा समर्थित है, जैसे कि Oracle या SQL सर्वर। यदि आप MySQL डेटाबेस तालिका में एक ही कार्य करना चाहते हैं तो आपको पंक्तियों को कॉलम में घुमाने के लिए CASE कथन का उपयोग करके चयन क्वेरी लिखनी होगी। लेख संबंधित MySQL डेटाबेस तालिकाओं के भीतर PIVOT () फ़ंक्शन के कार्य को करने का तरीका दिखाता है।

पूर्वापेक्षा:

आपको एक डेटाबेस और कुछ संबंधित तालिकाएँ बनानी होंगी जहाँ एक तालिका की पंक्तियों को PIVOT () फ़ंक्शन जैसे स्तंभों में परिवर्तित किया जाएगा। 'नामक डेटाबेस बनाने के लिए निम्न SQL कथन चलाएँ' यूनिडीबी ' और 'नाम से तीन टेबल बनाएं छात्रों ',' पाठ्यक्रम ' तथा ' नतीजा '। छात्रों तथा नतीजा तालिकाएँ एक-से-अनेक संबंध से संबंधित होंगी और पाठ्यक्रम तथा परिणाम टेबल यहां एक-से-कई संबंधों से संबंधित होंगे। का बयान बनाएं नतीजा तालिका में फ़ील्ड के लिए दो विदेशी कुंजी बाधाएं हैं, std_id , तथा पाठ्यक्रम आईडी .







डेटाबेस यूनिडीबी बनाएं;
यूनीडीबी का उपयोग करें;

टेबल छात्र बनाएं(
पहचानINT प्राथमिक कुंजी,
नाम(पचास)अशक्त नहीं,
विभाग वचर(पंद्रह)अशक्त नहीं);

टेबल पाठ्यक्रम बनाएं(
course_id VARCHAR(बीस)प्राथमिक कुंजी,
नाम(पचास)अशक्त नहीं,
क्रेडिट स्मॉलिंट नॉट न्यूल);

तालिका परिणाम बनाएं(
std_id शून्य नहीं है,
course_id VARCHAR(बीस)अशक्त नहीं,
मार्क_टाइप VARCHAR(बीस)अशक्त नहीं,
SMALLINT NOT NULL के निशान,
विदेशी कुंजी(std_id)संदर्भ छात्र(पहचान),
विदेशी कुंजी(पाठ्यक्रम आईडी)संदर्भ पाठ्यक्रम(पाठ्यक्रम आईडी),
प्राथमिक कुंजी(std_id, course_id, mark_type));

इसमें कुछ रिकॉर्ड डालें छात्र, पाठ्यक्रम और परिणाम टेबल। तालिका निर्माण के समय निर्धारित प्रतिबंधों के आधार पर मानों को तालिकाओं में सम्मिलित किया जाना चाहिए।



छात्रों के मूल्यों में प्रवेश करें
( '1937463','हार्पर ली','सीएसई'),
( '१९३७४६४','गार्सिया मार्केज़','सीएसई'),
( '1937465','फोर्स्टर, ईएम','सीएसई'),
( '1937466','राल्फ एलिसन','सीएसई');

पाठ्यक्रम मूल्यों में सम्मिलित करें
( 'सीएसई-401','वस्तु उन्मुख कार्यकर्म',3),
( 'सीएसई-403','डेटा संरचना',2),
( 'सीएसई-407','यूनिक्स प्रोग्रामिंग',2);

परिणाम मूल्यों में सम्मिलित करें
( '1937463','सीएसई-401','आंतरिक परीक्षा',पंद्रह),
( '1937463','सीएसई-401','अर्धवार्षिक परीक्षायें',बीस),
( '1937463','सीएसई-401','आखरी परीक्षा',35),
( '१९३७४६४','सीएसई-403','आंतरिक परीक्षा',17),
( '१९३७४६४','सीएसई-403','अर्धवार्षिक परीक्षायें',पंद्रह),
( '१९३७४६४','सीएसई-403','आखरी परीक्षा',30),
( '1937465','सीएसई-401','आंतरिक परीक्षा',१८),
( '1937465','सीएसई-401','अर्धवार्षिक परीक्षायें',2. 3),
( '1937465','सीएसई-401','आखरी परीक्षा',38),
( '1937466','सीएसई-407','आंतरिक परीक्षा',बीस),
( '1937466','सीएसई-407','अर्धवार्षिक परीक्षायें',22),
( '1937466','सीएसई-407','आखरी परीक्षा',40);

यहां, नतीजा तालिका में के लिए कई समान मान हैं std_id , मार्क_टाइप तथा पाठ्यक्रम आईडी प्रत्येक पंक्ति में कॉलम। डेटा को अधिक व्यवस्थित प्रारूप में प्रदर्शित करने के लिए इन पंक्तियों को इस तालिका के कॉलम में कैसे परिवर्तित किया जाए, यह इस ट्यूटोरियल के अगले भाग में दिखाया गया है।



CASE स्टेटमेंट का उपयोग करके पंक्तियों को कॉलम में घुमाएँ:

के सभी रिकॉर्ड प्रदर्शित करने के लिए निम्नलिखित सरल चयन कथन चलाएँ नतीजा टेबल।





चुनते हैं*परिणाम से;

आउटपुट तीन प्रकार के तीन पाठ्यक्रमों के लिए चार छात्रों के अंक दिखाता है। तो के मान std_id , पाठ्यक्रम आईडी तथा मार्क_टाइप विभिन्न छात्रों, पाठ्यक्रमों और परीक्षा प्रकारों के लिए कई बार दोहराया जाता है।



यदि CASE कथन का उपयोग करके SELECT क्वेरी को अधिक कुशलता से लिखा जा सकता है तो आउटपुट अधिक पठनीय होगा। CASE स्टेटमेंट के साथ निम्नलिखित SELECT पंक्तियों के दोहराए जाने वाले मानों को कॉलम नामों में बदल देगा और उपयोगकर्ता के लिए अधिक समझने योग्य प्रारूप में तालिकाओं की सामग्री प्रदर्शित करेगा।

परिणाम चुनें.std_id, result.course_id,
मैक्स(मामला जब result.mark_type ='आंतरिक परीक्षा'फिर result.marks END) 'आंतरिक परीक्षा',
मैक्स(मामला जब result.mark_type ='अर्धवार्षिक परीक्षायें'फिर result.marks END) 'अर्धवार्षिक परीक्षायें',
मैक्स(मामला जब result.mark_type ='आखरी परीक्षा'फिर result.marks END) 'आखरी परीक्षा'
परिणाम से
GROUP BY result.std_id, result.course_id
result.std_id, result.course_id ASC द्वारा ऑर्डर करें;

उपरोक्त कथन को चलाने के बाद निम्न आउटपुट दिखाई देगा जो पिछले आउटपुट की तुलना में अधिक पठनीय है।

CASE और SUM() का उपयोग करके पंक्तियों को कॉलम में घुमाएँ:

यदि आप तालिका से प्रत्येक छात्र के प्रत्येक पाठ्यक्रम की कुल संख्या की गणना करना चाहते हैं तो आपको कुल कार्य का उपयोग करना होगा योग () द्वारा समूह बनाएं std_id तथा पाठ्यक्रम आईडी केस स्टेटमेंट के साथ। निम्न क्वेरी SUM () फ़ंक्शन और ग्रुप बाय क्लॉज के साथ पिछली क्वेरी को संशोधित करके बनाई गई है।

परिणाम चुनें.std_id,result.course_id,
मैक्स(मामला जब result.mark_type ='आंतरिक परीक्षा'फिर result.marks END) 'आंतरिक परीक्षा',
मैक्स(मामला जब result.mark_type ='अर्धवार्षिक परीक्षायें'फिर result.marks END) 'अर्धवार्षिक परीक्षायें',
मैक्स(मामला जब result.mark_type ='आखरी परीक्षा'फिर result.marks END) 'आखरी परीक्षा',
योग(परिणाम अंक) जैसाकुल
परिणाम से
GROUP BY result.std_id, result.course_id
result.std_id, result.course_id ASC द्वारा ऑर्डर करें;

आउटपुट नाम का एक नया कॉलम दिखाता है कुल जो प्रत्येक विशेष छात्र द्वारा प्राप्त प्रत्येक पाठ्यक्रम के सभी परीक्षा प्रकारों के अंकों का योग प्रदर्शित कर रहा है।

एकाधिक तालिकाओं में पंक्तियों को स्तंभों में घुमाएँ:

पिछले दो प्रश्नों पर लागू होते हैं नतीजा टेबल। यह तालिका अन्य दो तालिकाओं से संबंधित है। य़े हैं छात्रों तथा पाठ्यक्रम . यदि आप छात्र आईडी के बजाय छात्र का नाम और पाठ्यक्रम आईडी के बजाय पाठ्यक्रम का नाम प्रदर्शित करना चाहते हैं तो आपको तीन संबंधित तालिकाओं का उपयोग करके चयन क्वेरी लिखनी होगी, छात्रों , पाठ्यक्रम तथा नतीजा . निम्न चयन क्वेरी को फॉर्म क्लॉज के बाद तीन टेबल नाम जोड़कर और तीन टेबल से डेटा पुनर्प्राप्त करने के लिए WHERE क्लॉज में उपयुक्त स्थितियां सेट करके और पिछले SELECT क्वेरी की तुलना में अधिक उपयुक्त आउटपुट उत्पन्न करके बनाया गया है।

छात्र चुनें।नामजैसा ``छात्र का नाम``, पाठ्यक्रम.नामजैसा ``कोर्स का नाम``,
मैक्स(मामला जब result.mark_type ='आंतरिक परीक्षा'फिर result.marks END) 'सीटी',
मैक्स(मामला जब result.mark_type ='अर्धवार्षिक परीक्षायें'फिर result.marks END) 'मध्य',
मैक्स(मामला जब result.mark_type ='आखरी परीक्षा'फिर result.marks END) 'अंतिम',
योग(परिणाम अंक) जैसाकुल
छात्रों से, पाठ्यक्रम, परिणाम
जहां result.std_id = student.id और result.course_id=courses.course_id
GROUP BY result.std_id, result.course_id
result.std_id, result.course_id ASC द्वारा ऑर्डर करें;

उपरोक्त क्वेरी को निष्पादित करने के बाद निम्न आउटपुट उत्पन्न होगा।

निष्कर्ष:

आप MySQL में Pivot() फ़ंक्शन के समर्थन के बिना Pivot() फ़ंक्शन की कार्यक्षमता को कैसे कार्यान्वित कर सकते हैं, इस आलेख में कुछ डमी डेटा का उपयोग करके दिखाया गया है। मुझे उम्मीद है कि पाठक इस लेख को पढ़ने के बाद सेलेक्ट क्वेरी का उपयोग करके किसी भी पंक्ति-स्तरीय डेटा को कॉलम-स्तरीय डेटा में बदलने में सक्षम होंगे।