আমি জানি যে এই প্রশ্নটি আরও পুরানো তবে আমি উত্তরগুলি খুঁজছিলাম এবং ভেবেছিলাম যে আমি সমস্যার "গতিশীল" অংশটি প্রসারিত করতে এবং সম্ভবত কাউকে সাহায্য করতে সক্ষম হতে পারি।
প্রথম এবং সর্বাগ্রে আমি কয়েকজন সহকর্মী অসুবিধাগুলি এবং বৃহত ডেটা সেটগুলি দ্রুত তৈরি করা দরকার এমন একটি সমস্যার সমাধানের জন্য এই সমাধানটি তৈরি করেছি।
এই সমাধানটির জন্য একটি সঞ্চিত প্রক্রিয়া তৈরি করা দরকার তাই এটি যদি আপনার প্রয়োজনের জন্য প্রশ্ন থেকে থাকে তবে দয়া করে এখনই পড়া বন্ধ করুন।
এই পদ্ধতিটি বিভিন্ন টেবিল, কলামের নাম এবং সমষ্টিগুলির জন্য পিভট স্টেটমেন্টকে গতিশীলভাবে পিভট স্টেটমেন্ট তৈরি করতে একটি পিভট স্টেটমেন্টের মূল ভেরিয়েবল গ্রহণ করতে চলেছে। স্ট্যাটিক কলামটি পিভটের জন্য / পরিচয় কলাম হিসাবে গোষ্ঠী হিসাবে ব্যবহৃত হয় (এটি প্রয়োজনীয় না হলে কোড থেকে ছিটানো যেতে পারে তবে পাইভট বিবৃতিতে এটি বেশ সাধারণ এবং মূল সমস্যাটি সমাধান করার জন্য প্রয়োজনীয় ছিল), পিভট কলামটি যেখানে শেষ ফলক কলামের নামগুলি থেকে উত্পন্ন হবে এবং মান কলামটি সমষ্টিতে প্রয়োগ করা হবে। টেবিলের প্যারামিটারটি সারণীর নাম স্কিমা সহ (স্কিমা.ট্যাবিলাম) কোডটির এই অংশটি কিছুটা ভালবাসা ব্যবহার করতে পারে কারণ এটি যতটা চাই তা পরিষ্কার নয়। এটি আমার পক্ষে কাজ করেছিল কারণ আমার ব্যবহারটি প্রকাশ্যে মুখোমুখি হয়নি এবং স্কেল ইঞ্জেকশনটি উদ্বেগের বিষয় নয়।
সঞ্চিত পদ্ধতি তৈরি করতে কোড দিয়ে শুরু করা যাক। এই কোডটি এসএসএমএস 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)
নিম্নলিখিত উদাহরণগুলি বিভিন্ন উদাহরণ কার্যকর হিসাবে বিভিন্ন উদাহরণকে বিভিন্ন উদাহরণ দেখায় execution উদাহরণটি সহজ রাখার জন্য আমি স্থিতিশীল, পিভট এবং মান কলামগুলি পরিবর্তন করতে পছন্দ করি নি। কোডটি নিজেই গণ্ডগোল শুরু করার জন্য আপনার কেবল অনুলিপি এবং কপি করতে সক্ষম হওয়া উচিত
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'
এই প্রয়োগটি যথাক্রমে নিম্নলিখিত ডেটা সেটগুলি প্রদান করে।