একক নির্বাচনী বিবৃতিতে একাধিক ব্যাপ্তির জন্য ফেরত গণনা


9

আমার কাছে পোস্টগ্রিস ডাটাবেস টেবিল রয়েছে fooযা অন্যান্য জিনিসের মধ্যে score0 থেকে 10 এর মধ্যে রয়েছে একটি কলাম রয়েছে I এবং 6, এবং 7 থেকে 10 এর মধ্যে স্কোর সংখ্যা: নীচের মত কিছু:

SELECT
  COUNT(*) as total,
  COUNT(
    SELECT * from foo where score between 0 and 3;
  ) as low,
  COUNT(
    SELECT * from foo where score between 4 and 6;
  ) as mid,
  COUNT(
    SELECT * from foo where score between 7 and 10;
  ) as high
FROM foo;

আমি এই চেষ্টা করেছি, কিন্তু একটি ত্রুটি পেয়েছিলাম SELECTমধ্যে COUNTবিবৃতি। কোনও ধারণা কীভাবে আমি এটি করতে পারি? আমি নিশ্চিত পোস্টগ্রিসে খুব সহজ উপায় আছে। আমি কেবল গুগলের জন্য সঠিক পদগুলি বের করতে পারি না।

উত্তর:


7

SUM()প্রতিটি সংখ্যা ব্যাপ্তির জন্য কেবলমাত্র কলামে শর্তাধীন বিবৃতি ব্যবহার করুন । কেবলমাত্র ব্যবহার করে মোটের যোগফল দেওয়া যেতে পারে SUM(1), ধরে নেওয়া সারণীতে থাকা সমস্ত ডেটা সীমার মধ্যে রয়েছে - যদি তা না হয় তবে কেবল অন্যের মতোই এটি সীমাবদ্ধ রাখুন।

select sum(case when score between 0 and 3 then 1 else 0 end) as minrange,
       sum(case when score between 4 and 6 then 1 else 0 end) as midrange,
       sum(case when score between 7 and 10 then 1 else 0 end) as maxrange,
       sum(1) as total
from foo;

এসকিউএল ফিডল লিঙ্ক


8

FILTERপোস্টগ্রিস 9.4+ এ সমষ্টিগত ধারা

পোস্টগ্রাগেস 9.4 এর পর থেকে একটি পরিষ্কার এবং দ্রুত (এসকিউএল স্ট্যান্ডার্ড) উপায় রয়েছে:

SELECT count(*) FILTER (WHERE score BETWEEN 0 AND 3)  AS low
     , count(*) FILTER (WHERE score BETWEEN 4 AND 7)  AS mid
     , count(*) FILTER (WHERE score BETWEEN 8 AND 10) AS high
     , count(*)                                       AS total
FROM   foo;

totalযোগ করা হয় low, midএবং high, যদি না NULL বা অন্যান্য মান জড়িত থাকে।

লিঙ্ক:

নীচে পড়ুন।

পোস্টগ্রিজ 9.3-

কয়েকটি কৌশল রয়েছে:

@ ফিল একটি CASEবিবৃতি সহ স্ট্যান্ডার্ড উপায় সরবরাহ করেছে (ব্যতীত sum(1), যা আদর্শ উপায় নয়)। আমি একটি সংক্ষিপ্ত ফর্ম ব্যবহার করতে চাই:

SELECT count(score BETWEEN 0 AND 3  OR NULL) AS low
     , count(score BETWEEN 4 AND 6  OR NULL) AS mid
     , count(score BETWEEN 7 AND 10 OR NULL) AS high
     , count(*)                              AS total
FROM   foo;

যদি আপনার প্রশ্নগুলিতে আপনার মানগুলি সংজ্ঞায়িত করা হয় (কেবল 0- 10সম্ভব) তবে আরও সরল করুন:

SELECT count(score < 4 OR NULL)             AS low
     , count(score BETWEEN 4 AND 6 OR NULL) AS mid
     , count(score > 6 OR NULL)             AS high
     , count(*)                             AS total
FROM   foo;

কিছুটা খাটো, সবেমাত্র দ্রুত।

সূক্ষ্ম পার্থক্য

আছে সূক্ষ্ম পার্থক্য যখন তুলনায় sum()ফিল এর উত্তর :

  • সর্বাধিক গুরুত্বপূর্ণ, প্রতি নথি :

    এটি লক্ষ করা উচিত যে ব্যতীত count, কোনও সারি নির্বাচন করা না হলে এই ফাংশনগুলি একটি নাল মান প্রদান করে। বিশেষত, sumকোনও সারি শূন্য হয় না, শূন্য নয় যেমন প্রত্যাশা করা যায়, ...

  • count(*) হয় আদর্শ উপায় এবং একটি বিট যতো তাড়াতাড়ি sum(1)। আবার, নাল বনাম 0 প্রয়োগ হয়।

এগুলির যে কোনও প্রশ্নের (ফিল সহ) নাল মান গণনা করে total। যদি এটি পছন্দসই না হয় তবে পরিবর্তে ব্যবহার করুন:

count(score) AS total_not_null

পৃষ্ঠা 9.3 এ এসকিউএল ফিডল । pb 10 এ এখানে
ডিবি <> বেহাল

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