मुझे पता है कि यह सवाल पुराना है, लेकिन मैं जवाबों को देख रहा था और सोचा था कि मैं समस्या के "गतिशील" हिस्से पर विस्तार करने में सक्षम हो सकता हूं और संभवत: किसी की मदद कर सकता हूं।
सबसे पहले और सबसे पहले मैंने इस समस्या को हल करने के लिए एक सहकर्मी के एक जोड़े को अनिर्णायक और बड़े डेटा सेटों को जल्दी से समाप्त करने की आवश्यकता के साथ बनाया था।
इस समाधान के लिए एक संग्रहीत प्रक्रिया के निर्माण की आवश्यकता है ताकि यदि आपकी आवश्यकताओं के लिए यह प्रश्न बाहर हो तो कृपया अब पढ़ना बंद कर दें।
यह प्रक्रिया अलग-अलग तालिकाओं, स्तंभ नामों और समुच्चय के लिए धुरी बयानों को गतिशील रूप से बनाने के लिए एक धुरी कथन के प्रमुख चर में लेने जा रही है। स्थैतिक स्तंभ का उपयोग समूह के रूप में / धुरी के लिए पहचान कॉलम के रूप में किया जाता है (यदि आवश्यक नहीं है तो कोड से बाहर निकाला जा सकता है लेकिन धुरी के बयानों में बहुत सामान्य है और मूल मुद्दे को हल करने के लिए आवश्यक था), धुरी स्तंभ वह जगह है जहां अंतिम परिणामी स्तंभ नाम से उत्पन्न किया जाएगा, और मूल्य स्तंभ वह है जो कुल लागू किया जाएगा। तालिका पैरामीटर स्कीमा (schema.tablename) सहित तालिका का नाम है। कोड का यह भाग कुछ प्रेम का उपयोग कर सकता है क्योंकि यह उतना साफ नहीं है जितना कि मैं चाहूंगा। इसने मेरे लिए काम किया क्योंकि मेरा उपयोग सार्वजनिक रूप से सामना नहीं कर रहा था और एसक्यूएल इंजेक्शन चिंता का विषय नहीं था।
संग्रहीत कार्यविधि बनाने के लिए कोड के साथ प्रारंभ करें। यह कोड SSMS 2005 और उसके बाद के सभी संस्करणों में काम करना चाहिए लेकिन मैंने इसे 2005 या 2016 में परीक्षण नहीं किया है, लेकिन मैं यह नहीं देख सकता कि यह काम क्यों नहीं करेगा।
create PROCEDURE [dbo].[USP_DYNAMIC_PIVOT]
(
@STATIC_COLUMN VARCHAR(255),
@PIVOT_COLUMN VARCHAR(255),
@VALUE_COLUMN VARCHAR(255),
@TABLE VARCHAR(255),
@AGGREGATE VARCHAR(20) = null
)
AS
BEGIN
SET NOCOUNT ON;
declare @AVAIABLE_TO_PIVOT NVARCHAR(MAX),
@SQLSTRING NVARCHAR(MAX),
@PIVOT_SQL_STRING NVARCHAR(MAX),
@TEMPVARCOLUMNS NVARCHAR(MAX),
@TABLESQL NVARCHAR(MAX)
if isnull(@AGGREGATE,'') = ''
begin
SET @AGGREGATE = 'MAX'
end
SET @PIVOT_SQL_STRING = 'SELECT top 1 STUFF((SELECT distinct '', '' + CAST(''[''+CONVERT(VARCHAR,'+ @PIVOT_COLUMN+')+'']'' AS VARCHAR(50)) [text()]
FROM '+@TABLE+'
WHERE ISNULL('+@PIVOT_COLUMN+','''') <> ''''
FOR XML PATH(''''), TYPE)
.value(''.'',''NVARCHAR(MAX)''),1,2,'' '') as PIVOT_VALUES
from '+@TABLE+' ma
ORDER BY ' + @PIVOT_COLUMN + ''
declare @TAB AS TABLE(COL NVARCHAR(MAX) )
INSERT INTO @TAB EXEC SP_EXECUTESQL @PIVOT_SQL_STRING, @AVAIABLE_TO_PIVOT
SET @AVAIABLE_TO_PIVOT = (SELECT * FROM @TAB)
SET @TEMPVARCOLUMNS = (SELECT replace(@AVAIABLE_TO_PIVOT,',',' nvarchar(255) null,') + ' nvarchar(255) null')
SET @SQLSTRING = 'DECLARE @RETURN_TABLE TABLE ('+@STATIC_COLUMN+' NVARCHAR(255) NULL,'+@TEMPVARCOLUMNS+')
INSERT INTO @RETURN_TABLE('+@STATIC_COLUMN+','+@AVAIABLE_TO_PIVOT+')
select * from (
SELECT ' + @STATIC_COLUMN + ' , ' + @PIVOT_COLUMN + ', ' + @VALUE_COLUMN + ' FROM '+@TABLE+' ) a
PIVOT
(
'+@AGGREGATE+'('+@VALUE_COLUMN+')
FOR '+@PIVOT_COLUMN+' IN ('+@AVAIABLE_TO_PIVOT+')
) piv
SELECT * FROM @RETURN_TABLE'
EXEC SP_EXECUTESQL @SQLSTRING
END
आगे हम अपना डेटा उदाहरण के लिए तैयार करेंगे। मैंने समग्र परिवर्तन के विभिन्न आउटपुट दिखाने के लिए अवधारणा के इस प्रमाण में उपयोग करने के लिए डेटा तत्वों के एक जोड़े के साथ स्वीकृत उत्तर से डेटा उदाहरण लिया है।
create table temp
(
date datetime,
category varchar(3),
amount money
)
insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('1/1/2012', 'ABC', 2000.00) -- added
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'DEF', 1500.00) -- added
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('2/10/2012', 'DEF', 800.00) -- addded
insert into temp values ('3/1/2012', 'ABC', 1100.00)
विभिन्न उदाहरणों को सरल उदाहरण के रूप में दिखाते हुए निम्नलिखित उदाहरण विभिन्न निष्पादन विवरण दिखाते हैं। उदाहरण को सरल रखने के लिए मैंने स्थैतिक, धुरी और मान स्तंभ बदलने का विकल्प नहीं चुना। आपको इसे स्वयं से मैसेज करना शुरू करने के लिए कोड को कॉपी और पेस्ट करने में सक्षम होना चाहिए
exec [dbo].[USP_DYNAMIC_PIVOT] 'date','category','amount','dbo.temp','sum'
exec [dbo].[USP_DYNAMIC_PIVOT] 'date','category','amount','dbo.temp','max'
exec [dbo].[USP_DYNAMIC_PIVOT] 'date','category','amount','dbo.temp','avg'
exec [dbo].[USP_DYNAMIC_PIVOT] 'date','category','amount','dbo.temp','min'
यह निष्पादन क्रमशः निम्नलिखित डेटा सेट लौटाता है।