MySQL
तैयार स्टेटमेंट का उपयोग करते हुए डायनामिक अन-पिवट टेबल
खोज…
शर्त के आधार पर स्तंभों का एक गतिशील सेट पिवट करें
निम्न उदाहरण एक बहुत ही उपयोगी आधार है जब आप BI / रिपोर्टिंग कारणों के लिए लेनदेन डेटा को अन-पिवोट डेटा में परिवर्तित करने का प्रयास कर रहे हैं, जहां आयाम जो अन-पिवोट किए जाने हैं, उनमें स्तंभों का एक गतिशील सेट हो सकता है।
हमारे उदाहरण के लिए, हम मानते हैं कि कच्चे डेटा तालिका में चिह्नित प्रश्नों के रूप में कर्मचारी मूल्यांकन डेटा है।
कच्चे डेटा तालिका निम्नलिखित है:
create table rawdata
(
PersonId VARCHAR(255)
,Question1Id INT(11)
,Question2Id INT(11)
,Question3Id INT(11)
)
रॉडेटा तालिका ईटीएल प्रक्रिया के भाग के रूप में एक अस्थायी तालिका है और इसमें प्रश्नों की संख्या भिन्न हो सकती है। लक्ष्य अनियंत्रित संख्याओं के लिए एक ही संयुक्त राष्ट्र की धुरी प्रक्रिया का उपयोग करना है, अर्थात् स्तंभ जो संयुक्त राष्ट्र के लिए नहीं जा रहे हैं।
नीचे रॉडेटा टेबल का एक खिलौना उदाहरण दिया गया है:
MYSQL में डेटा को अनपिट करने के लिए प्रसिद्ध, स्थिर तरीका UNION ALL का उपयोग कर रहा है:
create table unpivoteddata
(
PersonId VARCHAR(255)
,QuestionId VARCHAR(255)
,QuestionValue INT(11)
);
INSERT INTO unpivoteddata SELECT PersonId, 'Question1Id' col, Question1Id
FROM rawdata
UNION ALL
SELECT PersonId, 'Question2Id' col, Question2Id
FROM rawdata
UNION ALL
SELECT PersonId, 'Question3Id' col, Question3Id
FROM rawdata;
हमारे मामले में हम प्रश्न संख्या कॉलम की एक अनियंत्रित संख्या को अनप्राइव करने के तरीके को परिभाषित करना चाहते हैं। उसके लिए हमें एक तैयार किए गए कथन को निष्पादित करना होगा जो वांछित कॉलम का एक गतिशील चयन है। यह चुनने में सक्षम होने के लिए कि कौन से कॉलम को अन-पिवोट किए जाने की आवश्यकता है, हम एक GROUP_CONCAT स्टेटमेंट का उपयोग करेंगे और हम उन कॉलमों को चुनेंगे जिनके लिए डेटा प्रकार 'int' पर सेट है। GROUP_CONCAT में हम अपने SELECT स्टेटमेंट के सभी अतिरिक्त तत्वों को भी शामिल करते हैं।
set @temp2 = null;
SELECT GROUP_CONCAT(' SELECT ', 'PersonId',',','''',COLUMN_NAME,'''', ' col ',',',COLUMN_NAME,' FROM rawdata' separator ' UNION ALL' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'rawdata' AND DATA_TYPE = 'Int' INTO @temp2;
select @temp2;
एक अन्य अवसर में हम स्तंभों को चुन सकते हैं कि स्तंभ नाम एक पैटर्न से मेल खाता है, उदाहरण के लिए
DATA_TYPE = 'Int'
उपयोग
COLUMN_NAME LIKE 'Question%'
या उपयुक्त कुछ जिसे ईटीएल चरण के माध्यम से नियंत्रित किया जा सकता है।
तैयार कथन को अंतिम रूप दिया गया है:
set @temp3 = null;
select concat('INSERT INTO unpivoteddata',@temp2) INTO @temp3;
select @temp3;
prepare stmt FROM @temp3;
execute stmt;
deallocate prepare stmt;
निम्नपत्रिका तालिका निम्न है:
SELECT * FROM unpivoteddata
एक शर्त के अनुसार कॉलम का चयन करना और फिर तैयार किए गए स्टेटमेंट को तैयार करना गतिशील रूप से अन-पिवेटिंग डेटा का एक प्रभावी तरीका है।