आप तालिका को स्थानांतरित करने के लिए गतिशील SQL का उपयोग कर सकते हैं:
DECLARE @cols NVARCHAR(MAX) =
STUFF((SELECT DISTINCT ',' + QUOTENAME(CONCAT([Year], '_', [Month]))
FROM #tab
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
DECLARE @query NVARCHAR(MAX) =
FORMATMESSAGE(
N'SELECT col_name, customer, %s
FROM (SELECT [year_month] = CONCAT([Year], ''_'', [Month]),
Customer, No_Trans, spend, points
FROM #tab) AS sub
UNPIVOT
(
val FOR col_name IN (No_trans, spend, points)
) AS unpvt
PIVOT
(
MAX(val) FOR [year_month] IN (%s)
) AS pvt
ORDER BY customer, col_name;', @cols, @cols);
EXEC [dbo].[sp_executesql] @query;
आउटपुट:
╔══════════╦══════════╦════════╦════════╦════════╗
║ col ║ customer ║ 2015_1 ║ 2015_2 ║ 2015_3 ║
╠══════════╬══════════╬════════╬════════╬════════╣
║ No_Trans ║ 1 ║ 30 ║ 20 ║ 10 ║
║ points ║ 1 ║ 10 ║ 5 ║ 15 ║
║ spend ║ 1 ║ 400 ║ 150 ║ 500 ║
║ No_Trans ║ 2 ║ 5 ║ ║ ║
║ points ║ 2 ║ 7 ║ ║ ║
║ spend ║ 2 ║ 100 ║ ║ ║
╚══════════╩══════════╩════════╩════════╩════════╝
अगर आप zeros
चाहते हैं लापता स्थिति में आप ISNULL/COALESCE
. का उपयोग कर सकते हैं . ध्यान रखें कि प्रत्येक डेटाटाटाइप को 0 (int)
. द्वारा प्रतिस्थापित नहीं किया जा सकता है
संपादित करें:
FORMATMESSAGE
%s
. को बदलने का शानदार तरीका है स्ट्रिंग के साथ। इसे सरल REPLACE
. द्वारा आसानी से बदला जा सकता है :
DECLARE @query NVARCHAR(MAX) =
N'SELECT col1, col2, <placeholder>
FROM ...
...
PIVOT( MAX(col) IN col2 IN (<placeholder>)
...';
SET @query = REPLACE(@query, '<placeholder', @cols);
-- for debug
PRINT @query;
यह कैसे काम करता है:
- जनरेट
[year_month]
सबक्वेरी में कॉलम UNPIVOT
डेटा (कॉलम टू रो)PIVOT
परिणाम (पंक्तियों से कॉलम तक)- इसे डायनेमिक-एसक्यूएल के साथ लपेटें ताकि
[year_month]
जाने बिना कॉलम जेनरेट करने की अनुमति मिल सके अग्रिम में।