गतिशील SQL उदाहरण के साथ PIVOT का उपयोग कर SQL सर्वर
SQL सर्वर एक वास्तविक दुनिया प्रकार के परिदृश्य में एक जटिल PIVOT फ़ंक्शन का उपयोग कर रहा है, जहां कॉलम की संख्या हमेशा समान नहीं हो सकती है।
लेखक
पिछले लेख में, मैंने एक मानक परिदृश्य में PIVOT का उपयोग करने के बारे में लिखा था, जहां आप अपने इच्छित सभी कॉलमों को जानते हैं, उसी डेटा का उपयोग करके अब हम वास्तविक डेटा सेट पर निर्भर कॉलम नाम बनाने के लिए उस पर बना सकते हैं।
मैं उस लेख के पहले भाग को छोड़ दूंगा लेकिन हमें यहां लाने और चलाने के लिए एसक्यूएल प्रदान करूंगा। सबसे पहले, एक डेटा सेट बनाते हैं।
CREATE TYPE c1bs_Piv AS TABLE(MyRow NVARCHAR(10),--Row IDMyCol NVARCHAR(10),--Value to become columnCalcCol INT--Value to be Summed)GODECLARE @Piv c1bs_PivINSERT INTO @PivSELECT '1','1',1 UNIONSELECT '1','s',1 UNIONSELECT '1','3',1 UNIONSELECT '2','2',6 UNIONSELECT '2','2',1 UNIONSELECT '2','3',1 UNIONSELECT '3','5',5 UNIONSELECT '3','2',1 UNIONSELECT '3','3',1 UNIONSELECT '3','3',3
क्या ये सहायक था?
दूसरे लेख में, हमने कॉलम नामों (1,2,3) को हार्ड कोड किया था, हालांकि, यह हमेशा व्यवहार्य नहीं हो सकता है, कभी-कभी रिकॉर्ड सेट को बढ़ने की आवश्यकता हो सकती है जब उदाहरण के लिए एक जीयूआई को डेटा सेट भेजना, एक है इसके चारों ओर, चलो इसके माध्यम से कदम से कदम मिलाकर चलते हैं;
- ऊपर के रूप में अपने डेटा का प्रतिनिधित्व करने के लिए एक तालिका प्रकार बनाएं।
- एक तालिका घोषित करें और उसमें अपना डेटा डालें (@Piv)
- दो चर घोषित करें, एक स्तंभ नामों को पिवट पर रखने के लिए, और एक चयन सूची के लिए, इस उदाहरण में, ISNULL का उपयोग करके और स्तंभ नामों से किसी भी NULL मान से छुटकारा मिलता है। हमने नामों को एक स्ट्रिंग में जोड़ने के लिए COALESCE का भी उपयोग किया है।
- @Piv तालिका के साथ एक और चर घोषित करें, ये पैरामीटर हैं जो बाद में पारित हो जाते हैं।
- हमारे एसक्यूएल को घोषित करें, यह वह जगह है जहां हम कॉलम नामों को इंजेक्ट करते हैं और सूची को साधारण पिवोट के संशोधित संस्करण में चुनते हैं।
- उपरोक्त SQL कथन निष्पादित करें, और पैरामीटर और @PIV तालिका में पास करें।
--Complex Pivot - unknown column names--Get Column Names for belowDECLARE @Cols NVARCHAR(MAX),@Sel NVARCHAR(MAX) SELECT @Cols=COALESCE(@Cols+',','')+'['+MyCol+']',--Concatenate the Columns @Sel =COALESCE(@Sel +',','')+'ISNULL(['+MyCol+'], 0) AS ['+MyCol+']' --Concatenate the Columns into a select listFROM @Piv GROUP BY MyCol
--Columns list displaySELECT @Cols ColumnList,@Sel SelectList
--Complex Pivot SQLDECLARE @Params NVARCHAR(MAX)='@Piv c1bs_Piv READONLY'DECLARE @SQL NVARCHAR(MAX)='SELECT [MyRow],'+@Sel+'FROM @PivPIVOT (SUM(CalcCol)FOR MyColIN ('+@Cols+')) AS MyTable'
--Execute SQLEXECUTE sp_executesql @SQL,--SQL String from above@Params,--Parameter list@Piv--Temp Table needs to be passed in, can only be read only?
क्या ये सहायक था?
हमारे डेटासेट में अब डेटासेट से दो अतिरिक्त कॉलम शामिल हो गए हैं (5,s)
MyRow | 1 | 2 | 3 | 5 | s |
1 | 1 | 0 | 1 | 0 | 1 |
2 | 0 | 7 | 1 | 0 | 0 |
3 | 0 | 1 | 4 | 5 | 0 |