এটি একটি সাধারণ পিভট রূপান্তর, এবং শর্তসাপেক্ষ একীকরণ, এটি ফিল প্রয়োগ করার ভাল পুরানো উপায়।
একই ফলাফল অর্জনের জন্য আরও একটি আধুনিক সিনট্যাক্স রয়েছে, যা পিআইওভিটি ক্লজটি ব্যবহার করে:
SELECT
CompanyName,
TotalOpenClaims = [1],
TotalClosedClaims = [2],
TotalReOpenedClaims = [3],
TotalPendingClaims = [4]
FROM
dbo.Claims
PIVOT
(
COUNT(ClaimID)
FOR StatusID IN ([1], [2], [3], [4])
) AS p
;
অভ্যন্তরীণভাবে এই তর্কযুক্ত সরল চেহারা বাক্য গঠন ফিলের গ্রুপের ক্যোয়ারির সমতুল্য। আরও সঠিকভাবে, এটি এই পরিবর্তনের সমতুল্য:
SELECT
CompanyName,
TotalOpenClaims = COUNT(CASE WHEN StatusID = 1 THEN ClaimID END),
TotalClosedClaims = COUNT(CASE WHEN StatusID = 2 THEN ClaimID END),
TotalReOpenedClaims = COUNT(CASE WHEN StatusID = 3 THEN ClaimID END),
TotalPendingClaims = COUNT(CASE WHEN StatusID = 4 THEN ClaimID END)
FROM
dbo.Claims
GROUP BY
CompanyName
;
সুতরাং, একটি পিভট ক্যোয়ারী মূলত একটি অন্তর্নিহিত গ্রোপ কোয়েরি।
PIVOT অনুসন্ধানগুলি তবে শর্তসাপেক্ষ একীকরণের সাথে সুস্পষ্ট GROUP বাই ক্যোয়ারীর চেয়ে পরিচালনা করার ক্ষেত্রে কুখ্যাত। আপনি যখন পাইভট ব্যবহার করছেন তখন আপনার এই বিষয়টিকে সর্বদা মনে রাখা উচিত:
- সকল কলাম ডেটাসেটের pivoted হচ্ছে (
Claims
এই ক্ষেত্রে) স্পষ্টভাবে পিভট দফা উল্লেখ করা হয় নি যে দল কলাম হয় ।
যদি Claims
আপনার উদাহরণে প্রদর্শিত তিনটি কলামই থাকে তবে উপরের PIVOT ক্যোয়ারী প্রত্যাশার মতো কাজ করবে, কারণ সম্ভবত CompanyName
একমাত্র কলামটি PIVOT এ স্পষ্টভাবে উল্লেখ করা হয়নি এবং এইভাবে সংক্ষিপ্ত গ্রুপের একমাত্র মানদণ্ড হিসাবে শেষ হয়।
তবে, যদি Claims
অন্য কলামগুলি (বলুন ClaimDate
) থাকে তবে সেগুলি স্পষ্টতই অতিরিক্ত গ্রুপ বাই কলাম হিসাবে ব্যবহৃত হবে - এটি হ'ল আপনার ক্যোয়ারীটি মূলত করণীয় হবে
GROUP BY CompanyName, ClaimDate, ... /* whatever other columns there are*/`
ফলাফল সম্ভবত আপনি চান না।
যদিও এটি ঠিক করা সহজ। অন্তর্নিহিত গ্রুপিংয়ে অংশ নেওয়া থেকে অপ্রাসঙ্গিক কলামগুলি বাদ দেওয়ার জন্য, আপনি কেবলমাত্র একটি উত্পন্ন টেবিল ব্যবহার করতে পারেন, যেখানে আপনি ফলাফলের জন্য প্রয়োজনীয় কলামগুলি নির্বাচন করবেন, যদিও এটি ক্যোয়ারিকে কম মার্জিত-চেহারা দেখাচ্ছে:
SELECT
CompanyName,
TotalOpenClaims = [1],
TotalClosedClaims = [2],
TotalReOpenedClaims = [3],
TotalPendingClaims = [4]
FROM
(SELECT ClaimID, CompanyName, StatusID FROM dbo.Claims) AS derived
PIVOT
(
COUNT(ClaimID)
FOR StatusID IN ([1], [2], [3], [4])
) AS p
;
তবুও, যদি Claims
ইতিমধ্যে একটি উদ্ভূত টেবিল থাকে তবে নীড়ের অন্য স্তর যুক্ত করার দরকার নেই, কেবলমাত্র নিশ্চিত হয়ে নিন যে বর্তমান উত্পন্ন টেবিলটিতে আপনি আউটপুট উত্পাদন করার জন্য প্রয়োজনীয় কলামগুলি নির্বাচন করছেন।
আপনি ম্যানুয়ালটিতে পিভট সম্পর্কে আরও পড়তে পারেন: