आप ROW_NUMBER()
मानों की संख्या को चिह्नित करने के लिए, जैसे:1, 2, 3
।
ध्यान दें कि :ORDER BY [Balance] DESC
अपनी इच्छानुसार उत्पन्न मूल्य प्राप्त करने के लिए।
DECLARE
@columns NVARCHAR(MAX) = '',
@sql NVARCHAR(MAX) = '';
SELECT Customer, Balance, Col = ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY [Balance] DESC)
into #b
FROM #a
SELECT @columns += QUOTENAME(Col) + ','
from (SELECT DISTINCT Col FROM #b) A
-- remove the last comma
SET @columns = LEFT(@columns, LEN(@columns) - 1);
SET @sql = 'SELECT * FROM ( SELECT Customer, Balance, Col FROM #b) src PIVOT( MAX([Balance]) FOR Col IN ('+ @columns +')) AS pivot_table;';
-- execute the dynamic SQL
EXECUTE sp_executesql @sql;
आउटपुट
अपडेट किया गया
सम्मिलित स्ट्रिंग्स के बाद से अदस्तावेजीकृत और अविश्वसनीय है . यह हमेशा अपेक्षा के अनुरूप काम नहीं करता है . तो आपको नीचे 2 समाधानों के साथ हल करना चाहिए
- STRING_AGG (एसक्यूएल सर्वर 2017 और देर से)
SELECT STRING_AGG(QUOTENAME(Col), ', ')
from (SELECT DISTINCT Col FROM #b) A
// Output: [1], [2], [3]
- उपयोग एक्सएमएल एक्सटेंशन
DECLARE @columns NVARCHAR(MAX) = ''
SELECT @columns = (
SELECT QUOTENAME(Col) + ', '
FROM (SELECT DISTINCT Col FROM #b) A
FOR XML PATH(''), TYPE
).value('.','varchar(max)')
SELECT @columns
// Output: [1], [2], [3],
धन्यवाद @ गैरेथडी की टिप्पणी। इसे db<>fiddle पर देखें।