Dynamic pivot query using MySQL -


मेरे पास विवरण के साथ निम्नलिखित तालिका है:

उदाहरण : < / P>

  टेबल बनाओ टेबल 1 (`पीके`आईटी,` नाम 'varchar (3), `विषय' varchar (9),` ग्रेड 'varchar (1)); मूल्य (1, 'बॉब', 'मठ', 'ए'), (2, 'बॉब', 'हिस्ट्री', 'बी') तालिका 1 (`पीके`,` नाम`, `विषय`,` ग्रेड`) में शामिल करें ',' 3 ',' बॉब ',' भाषा ',' सी '), (4,' बॉब ',' जीवविज्ञान ',' डी '), (5,' मुकदमा ',' इतिहास ',' सी ') , (6, 'मुकदमा', 'मठ', 'ए'), (7, 'मुकदमा', 'संगीत', 'ए'), (8, 'मुकदमा', 'भूगोल', 'सी');   

अब मैं एक स्टोर प्रक्रिया लिखना चाहता हूं जिसके माध्यम से मैं तालिका को धुरा करना चाहता हूं।

प्रयास
  DELIMITER $$ PROCEDURE sptest1 बनाएं (IN एनएम varchar (50), IN sub varchar (50)) SET @sql = NULL आरंभ करें; चुनें GROUP_CONCAT (अलग कंक्रीट ('मैक्स (मामले जब', एनएम, '=' '', एनएम, '' 'फिर ग्रेड अंत) `, एनएम,'` ')) टेबल 1 से @ एसक्यूएल में; SET @sql = CONCAT ('SELECT', उप, ',', @sql, 'से तालिका 1 समूह', उप, ''); @ Sql का चयन करें; एसएसएमएएम से एसटीएमटी तैयार करें; EXTUTE STMT; डेलॉलिकेट तैयार करें STMT; END $ $ DELIMITER;   

कॉलिंग फ़ंक्शन:

  कॉल sptest1 ('name', 'subject')   

लेकिन गलत परिणाम प्राप्त करना :

  विषय का नाम ---------------- जीवविज्ञान नल भूगोल रिकल इतिहास नल भाषा की नल गणित की नल संगीत रिक्त   < p> अपेक्षित परिणाम:  <पूर्व>  विषय बॉब सू ------------------------- जीवविज्ञान डी शून्य भूगोल रिक्त सी इतिहास बीसी भाषा सी नल मठ एए संगीत रिक्त ए    

आप डायनामिक एसक्यूएल क्वेरी को पुनः लिख सकते हैं <पूर्व> SET @sql = NULL; चुनें GROUP_CONCAT (अलग CONCAT ('MAX' (`नाम` = '' ',` नाम`,' '' फिर ग्रेड अंत) ',' नाम ')) तालिका 1 से @ एसक्यूएल में; SET @sql = CONCAT ('चयन करें' विषय ',', @sql, 'विषय' से तालिका 1 ग्रुप से); एसएसएमएएम से एसटीएमटी तैयार करें; EXTUTE STMT; डेलॉलिकेट तैयार करें STMT;

आपकी संग्रहीत कार्यविधि में आपको डायनामिक एसक्यूएल के लिए कड़ी मेहनत के लिए अपना नाम कॉलम देना होगा यदि आप इसे पैरामीटर के रूप में पास करते हैं तो आप कॉलम की जांच के लिए केस का उपयोग कर सकते हैं, उदाहरण के लिए

  मैक्स (मामले में ', एनएम,' = '' ', एनएम, ..   

प्रक्रिया के ऊपर अधिकतम (मामले में नाम = 'नाम' .. क्योंकि वेरिएबल एनएम में 'नाम' होता है, इसे इसे कॉलम के रूप में नहीं पहचाना जाएगा

  ड्रॉप प्रक्रिया ` Sptest1`; DELIMITER $$ बनाने की प्रक्रिया `sib`।` 1ptest1` (IN एनएम VARCHAR (50), IN उप VARCHAR (50)) BEGIN SET @sql = NULL; SELECT GROUP_CONCAT (अलग CONCAT ('अधिकतम (केस', ' एनएम, '=' '', मामला जब एनएम = 'नाम' तब `नाम 'ईएनडी,' 'फिर ग्रेड अंत), मामला जब एनएम =' नाम 'तब' नाम 'अंत)) तालिका 1 से @ एसक्यूएल में; SET @sql = CONCAT ('SELECT', उप, ',', @sql, 'तालिका 1 से ग्रुप बी', उप, ''); / * चयन करें @ एसक्यूएल; * / एसएमटी एफएम से @ एसक्यूएल; EXECUTE stmt; DEALLOCATE STMT; END $ $ DELIMITER;   

तैयार करें

Comments