একই টেবিলে বিভিন্ন কলামের জন্য গণনা কিভাবে পাবেন


15

সারণী # 01 Status:

StatusID    Status
-----------------------
 1          Opened
 2          Closed
 3          ReOpened
 4          Pending

সারণী # 02 Claims:

ClaimID     CompanyName StatusID
--------------------------------------
1               ABC     1
2               ABC     1
3               ABC     2
4               ABC     4
5               XYZ     1
6               XYZ     1

প্রত্যাশিত ফলাফল:

CompanyName TotalOpenClaims TotalClosedClaims TotalReOpenedClaims TotalPendingClaims
--------------------------------------------------------------------------------
ABC                 2           1                      0               1
XYZ                 2           0                      0               0

আমার কীভাবে ক্যোয়ারী লিখতে হবে যাতে আমি প্রত্যাশা মতো ফলাফল পেতে পারি?

উত্তর:


26

এটি সবচেয়ে সহজ SUM()এবং একটি CASEবিবৃতি সহ:

select CompanyName, 
sum(case when StatusID=1 then 1 else 0 end) as TotalOpenClaims,
sum(case when StatusID=2 then 1 else 0 end) as TotalClosedClaims,
sum(case when StatusID=3 then 1 else 0 end) as TotalReOpenedClaims,
sum(case when StatusID=4 then 1 else 0 end) as TotalPendingClaims
from Claims
group by CompanyName;

16

এটি একটি সাধারণ পিভট রূপান্তর, এবং শর্তসাপেক্ষ একীকরণ, এটি ফিল প্রয়োগ করার ভাল পুরানো উপায়।

একই ফলাফল অর্জনের জন্য আরও একটি আধুনিক সিনট্যাক্স রয়েছে, যা পিআইওভিটি ক্লজটি ব্যবহার করে:

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ইতিমধ্যে একটি উদ্ভূত টেবিল থাকে তবে নীড়ের অন্য স্তর যুক্ত করার দরকার নেই, কেবলমাত্র নিশ্চিত হয়ে নিন যে বর্তমান উত্পন্ন টেবিলটিতে আপনি আউটপুট উত্পাদন করার জন্য প্রয়োজনীয় কলামগুলি নির্বাচন করছেন।

আপনি ম্যানুয়ালটিতে পিভট সম্পর্কে আরও পড়তে পারেন:


1

স্বীকারযোগ্যভাবে আমার অভিজ্ঞতাটি মূলত মাইএসকিউএল এর সাথে থাকে এবং আমি এসকিউএল সার্ভারে বেশি সময় ব্যয় করি না। নিম্নলিখিত ক্যোয়ারীটি কাজ না করলে আমি খুব অবাক হব:

SELECT 
  CompanyName, 
  status, 
  COUNT(status) AS 'Total Claims' 
FROM Claim AS c 
  JOIN Status AS s ON c.statusId = s.statusId 
GROUP BY 
  CompanyName, 
  status;

এটি আপনাকে যে ফর্ম্যাটটি চান তা আউটপুট দেয় না তবে শূন্য ক্ষেত্রে বাদ দিলেও এটি আপনাকে সমস্ত তথ্য দেয়। এটি কেবলমাত্র ফর্ম্যাটিংয়ের জন্য ব্যবহার করা হচ্ছে এমন কোনও প্রশ্নের জন্য বিশেষত খারাপ ধারণা বলে মনে হচ্ছে এমন ক্যাসারের অভ্যন্তরে CASE বিবৃতিগুলির সাথে ডিল করার চেয়ে আমার কাছে অনেক সহজ মনে হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.