- पिवट टेबल के बारे में संक्षेप में
- उपकरणों के माध्यम से डेटा पिवट करना (MySQL के लिए dbForge Studio)
- एसक्यूएल के माध्यम से डेटा पिवट करना
- एसक्यूएल सर्वर के लिए टी-एसक्यूएल-आधारित उदाहरण
- MySQL के लिए उदाहरण
- डेटा पिवट को स्वचालित करना, गतिशील रूप से क्वेरी बनाना
पिवट टेबल के बारे में संक्षेप में
यह आलेख तालिका डेटा के पंक्तियों से स्तंभों में परिवर्तन से संबंधित है। इस तरह के परिवर्तन को पिवोटिंग टेबल कहा जाता है। अक्सर, धुरी का परिणाम एक सारांश तालिका होती है जिसमें सांख्यिकीय डेटा को रिपोर्ट के लिए उपयुक्त या आवश्यक रूप में प्रस्तुत किया जाता है।
इसके अलावा, इस तरह के डेटा परिवर्तन उपयोगी हो सकते हैं यदि डेटाबेस को सामान्यीकृत नहीं किया जाता है और जानकारी को गैर-इष्टतम रूप में संग्रहीत किया जाता है। इसलिए, जब डेटाबेस को पुनर्गठित किया जाता है और डेटा को नई तालिकाओं में स्थानांतरित किया जाता है या एक आवश्यक डेटा प्रतिनिधित्व उत्पन्न किया जाता है, तो डेटा पिवट मददगार हो सकता है, यानी पंक्तियों से परिणामी कॉलम में मूल्यों को स्थानांतरित करना।
नीचे उत्पादों की पुरानी तालिका का एक उदाहरण है - उत्पादपुराना और नया - उत्पाद नया। पंक्तियों से स्तंभों में परिवर्तन के माध्यम से ऐसा परिणाम आसानी से प्राप्त किया जा सकता है।
यहां पिवट टेबल का उदाहरण दिया गया है।
उपकरणों के माध्यम से डेटा को पिवट करना (MySQL के लिए dbForge Studio)
ऐसे एप्लिकेशन हैं जिनमें सुविधाजनक ग्राफिकल वातावरण में डेटा पिवट को लागू करने की अनुमति देने वाले टूल हैं। उदाहरण के लिए, MySQL के लिए dbForge Studio में Pivot Tables कार्यक्षमता शामिल है जो कुछ ही चरणों में वांछित परिणाम प्रदान करती है।
आइए ऑर्डर की सरलीकृत तालिका के साथ उदाहरण देखें - PurchaseOrderHeader ।
CREATE TABLE PurchaseOrderHeader ( PurchaseOrderID INT(11) NOT NULL, EmployeeID INT(11) NOT NULL, VendorID INT(11) NOT NULL, PRIMARY KEY (PurchaseOrderID) ); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (1, 258, 1580); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (2, 254, 1496); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (3, 257, 1494); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (4, 261, 1650); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (5, 251, 1654); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (6, 253, 1664); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (7, 255, 1678); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (8, 256, 1616); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (9, 259, 1492); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (10, 250, 1602); INSERT PurchaseOrderHeader(PurchaseOrderID, EmployeeID, VendorID) VALUES (11, 258, 1540); ...
मान लें कि हमें तालिका से चयन करने और विशिष्ट आपूर्तिकर्ताओं से कुछ कर्मचारियों द्वारा किए गए आदेशों की संख्या निर्धारित करने की आवश्यकता है। कर्मचारियों की सूची, जिसके लिए सूचना की आवश्यकता है - 250, 251, 252, 253, 254.
रिपोर्ट के लिए पसंदीदा दृश्य इस प्रकार है।
बायां कॉलम VendorID विक्रेताओं की आईडी दिखाता है; कॉलम Emp250 , Emp251 , Emp252 , Emp253 , और Emp254 आदेशों की संख्या प्रदर्शित करें।
MySQL के लिए dbForge Studio में इसे प्राप्त करने के लिए, आपको यह करना होगा:
- दस्तावेज़ के 'पिवट टेबल' प्रतिनिधित्व के लिए तालिका को डेटा स्रोत के रूप में जोड़ें। डेटाबेस एक्सप्लोरर में, PurchaseOrderHeader पर राइट-क्लिक करें तालिका और भेजें . चुनें और फिर पिवट टेबल पॉपअप मेनू में।
- एक कॉलम निर्दिष्ट करें जिसके मान पंक्तियाँ होंगे। VendorIDखींचें कॉलम 'ड्रॉप रो फील्ड्स हियर' बॉक्स में।
- एक कॉलम निर्दिष्ट करें जिसके मान कॉलम होंगे। कर्मचारी आईडी . खींचें कॉलम 'यहां ड्रॉप कॉलम फील्ड्स' बॉक्स में। आप आवश्यक कर्मचारियों (250, 251, 252, 253, 254) के लिए एक फ़िल्टर भी सेट कर सकते हैं।
- एक कॉलम निर्दिष्ट करें, जिसके मान डेटा होंगे। PurchaseOrderID को खीचें 'डेटा आइटम यहां ड्रॉप करें' बॉक्स में कॉलम।
- PurchaseOrderID . के गुणों में कॉलम, एकत्रीकरण का प्रकार निर्दिष्ट करें – मानों की गणना ।
हमें जल्दी ही वह परिणाम मिल गया जिसकी हमें आवश्यकता है।
एसक्यूएल के माध्यम से डेटा पिवट करना
बेशक, SQL क्वेरी लिखकर डेटाबेस के माध्यम से डेटा परिवर्तन किया जा सकता है। लेकिन एक छोटी सी अड़चन है, MySQL के पास ऐसा करने की अनुमति देने वाला कोई विशिष्ट कथन नहीं है।
SQL सर्वर के लिए T-SQL-आधारित उदाहरण
उदाहरण के लिए, SqlServer और Oracle में PIVOT ऑपरेटर है जो इस तरह के डेटा परिवर्तन की अनुमति देता है। अगर हम SqlServer के साथ काम करते हैं, तो हमारी क्वेरी इस तरह दिखेगी।
SELECT VendorID ,[250] AS Emp1 ,[251] AS Emp2 ,[252] AS Emp3 ,[253] AS Emp4 ,[254] AS Emp5 FROM (SELECT PurchaseOrderID ,EmployeeID ,VendorID FROM Purchasing.PurchaseOrderHeader) p PIVOT ( COUNT(PurchaseOrderID) FOR EmployeeID IN ([250], [251], [252], [253], [254]) ) AS t ORDER BY t.VendorID;
MySQL के लिए उदाहरण
MySQL में, हमें SQL के साधनों का उपयोग करना होगा। डेटा को विक्रेता कॉलम द्वारा समूहीकृत किया जाना चाहिए - VendorID , और प्रत्येक आवश्यक कर्मचारी के लिए (कर्मचारी आईडी ), आपको समग्र फ़ंक्शन के साथ एक अलग कॉलम बनाने की आवश्यकता है।
हमारे मामले में, हमें आदेशों की संख्या की गणना करने की आवश्यकता है, इसलिए हम कुल फ़ंक्शन COUNT का उपयोग करेंगे।
स्रोत तालिका में, सभी कर्मचारियों की जानकारी एक कॉलम में संग्रहीत की जाती है कर्मचारी आईडी , और हमें किसी विशेष कर्मचारी के लिए आदेशों की संख्या की गणना करने की आवश्यकता है, इसलिए हमें केवल कुछ पंक्तियों को संसाधित करने के लिए हमारे समग्र कार्य को सिखाने की आवश्यकता है।
समग्र फ़ंक्शन NULL मानों को ध्यान में नहीं रखता है, और हम इस विशेषता का उपयोग अपने उद्देश्यों के लिए करते हैं।
आप सशर्त ऑपरेटर IF या CASE का उपयोग कर सकते हैं जो वांछित कर्मचारी के लिए एक विशिष्ट मान लौटाएगा, अन्यथा बस NULL लौटाएगा; परिणामस्वरूप, COUNT फ़ंक्शन केवल गैर-शून्य मानों की गणना करेगा।
परिणामी क्वेरी इस प्रकार है:
SELECT VendorID, COUNT(IF(EmployeeID = 250, PurchaseOrderID, NULL)) AS Emp250, COUNT(IF(EmployeeID = 251, PurchaseOrderID, NULL)) AS Emp251, COUNT(IF(EmployeeID = 252, PurchaseOrderID, NULL)) AS Emp252, COUNT(IF(EmployeeID = 253, PurchaseOrderID, NULL)) AS Emp253, COUNT(IF(EmployeeID = 254, PurchaseOrderID, NULL)) AS Emp254 FROM PurchaseOrderHeader p WHERE p.EmployeeID BETWEEN 250 AND 254 GROUP BY VendorID;
या इस तरह भी:
VendorID, COUNT(IF(EmployeeID = 250, 1, NULL)) AS Emp250, COUNT(IF(EmployeeID = 251, 1, NULL)) AS Emp251, COUNT(IF(EmployeeID = 252, 1, NULL)) AS Emp252, COUNT(IF(EmployeeID = 253, 1, NULL)) AS Emp253, COUNT(IF(EmployeeID = 254, 1, NULL)) AS Emp254 FROM PurchaseOrderHeader p WHERE p.EmployeeID BETWEEN 250 AND 254 GROUP BY VendorID;
निष्पादित होने पर, एक परिचित परिणाम प्राप्त होता है।
डेटा पिवट को स्वचालित करना, गतिशील रूप से क्वेरी बनाना
जैसा कि देखा जा सकता है, क्वेरी में एक निश्चित स्थिरता होती है, यानी सभी रूपांतरित कॉलम एक समान तरीके से बनते हैं, और क्वेरी लिखने के लिए, आपको तालिका से विशिष्ट मानों को जानना होगा। पिवट क्वेरी बनाने के लिए, आपको सभी संभावित मानों की समीक्षा करनी होगी और उसके बाद ही आपको क्वेरी लिखनी चाहिए। वैकल्पिक रूप से, आप इस कार्य को एक सर्वर को पास कर सकते हैं जिससे यह इन मूल्यों को प्राप्त कर सके और गतिशील रूप से नियमित कार्य कर सके।
आइए पहले उदाहरण पर लौटते हैं, जिसमें हमने नई तालिका बनाई थी ProductsNew उत्पादपुराने . से टेबल। वहां, गुणों के मूल्य सीमित हैं, और हम सभी संभावित मूल्यों को भी नहीं जान सकते हैं; हमारे पास केवल यह जानकारी है कि गुणों के नाम और उनके मूल्य कहाँ संग्रहीत हैं। ये हैं संपत्ति और मान कॉलम, क्रमशः।
SQL क्वेरी बनाने का पूरा एल्गोरिथ्म मूल्यों को प्राप्त करने के लिए नीचे आता है, जिससे नए कॉलम और क्वेरी के अपरिवर्तनीय भागों के संयोजन बनेंगे।
SELECT GROUP_CONCAT( CONCAT( ' MAX(IF(Property = ''', t.Property, ''', Value, NULL)) AS ', t.Property ) ) INTO @PivotQuery FROM (SELECT Property FROM ProductOld GROUP BY Property) t; SET @PivotQuery = CONCAT('SELECT ProductID,', @PivotQuery, ' FROM ProductOld GROUP BY ProductID');
चर @PivotQuery हमारी क्वेरी को संग्रहीत करेगा, पाठ को स्पष्टता के लिए स्वरूपित किया गया है।
SELECT ProductID, MAX(IF(Property = 'Color', Value, NULL)) AS Color, MAX(IF(Property = 'Name', Value, NULL)) AS Name, MAX(IF(Property = 'ProductNumber', Value, NULL)) AS ProductNumber, MAX(IF(Property = 'Size', Value, NULL)) AS Size, MAX(IF(Property = 'SizeUnitMeasureCode', Value, NULL)) AS SizeUnitMeasureCode FROM ProductOld GROUP BY ProductID
इसे निष्पादित करने के बाद, हम उत्पाद नई तालिका की योजना के अनुरूप वांछित परिणाम प्राप्त करेंगे।
इसके अलावा, वैरिएबल @PivotQuery से क्वेरी को स्क्रिप्ट में MySQL स्टेटमेंट EXECUTE का उपयोग करके निष्पादित किया जा सकता है।
PREPARE statement FROM @PivotQuery; EXECUTE statement; DEALLOCATE PREPARE statement;