একই নির্বাচনী বিবৃতিতে কীভাবে গণনা এবং গোষ্ঠী ব্যবহার করবেন


223

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

select town, count(*) from user
group by town

আমি সমস্ত শহরগুলির সাথে একটি কলাম এবং সমস্ত সারি ব্যবহারকারীর সংখ্যা সহ একটি করতে চাই।

মোট 3 টি শহর এবং 58 জন ব্যবহারকারী থাকার ফলাফলের উদাহরণ:

Town         Count
Copenhagen   58
NewYork      58
Athens       58

আপনি বোঝাতে চাইছেন যে আপনি আপনার ফলাফলের জন্য একটি শহর এবং একটি ব্যবহারকারীর জন্য দুটি গণনা সেট করতে চান?
লেসেলি

2
সুতরাং আপনি প্রতিটি শহরের জন্য একটি সারি চান, এবং প্রতিটি সারিতে, কলাম 2 এ সমস্ত ব্যবহারকারীর মোট গণনা রয়েছে? সুতরাং কলাম 2 প্রতিটি সারির জন্য একই মান আছে? আপনি যদি নমুনা ডেটা এবং প্রয়োজনীয় আউটপুট অন্তর্ভুক্ত করতে সম্পাদনা করেন তবে আমরা আপনাকে যা চাই ঠিক তা দিতে সক্ষম হব।
আকাশম

তুমি ঠিক আকাশম! আমি এটি সম্পাদনা করেছি।
স্ট্যাভ্রোস

2
সংশ্লিষ্ট প্রশ্ন: stackoverflow.com/questions/5146978/...
milkovsky

1
পাঠকদের কাছে সতর্কতা: উত্তরগুলির বেশিরভাগই আপডেট হিসাবে ক্যোয়ারীর উত্তর সরবরাহ করতে ব্যর্থ হয়েছে।
রিক জেমস

উত্তর:


271

এটি আপনি যা চান তা করবে (প্রতিটি শহরের ব্যবহারকারীর সংখ্যা সহ শহরের তালিকা):

select town, count(town) 
from user
group by town

আপনি সবচেয়ে ব্যবহার করতে পারেন সমষ্টিগত ফাংশন ব্যবহার করে যখন GROUP BY

আপডেট (প্রশ্ন এবং মন্তব্যে নিম্নলিখিত পরিবর্তন)

আপনি ব্যবহারকারীর সংখ্যার জন্য একটি ভেরিয়েবল ঘোষণা করতে পারেন এবং এটি ব্যবহারকারীর সংখ্যাতে সেট করতে পারেন তারপরে এটি নির্বাচন করুন।

DECLARE @numOfUsers INT
SET @numOfUsers = SELECT COUNT(*) FROM user

SELECT DISTINCT town, @numOfUsers
FROM user

ওপি কি ঠিক তাই লিখেছেন? এনভিএম, আমি আপনার পার্থক্যটি দেখতে পাচ্ছি, আপনি টাউনটি গণনা করছেন না * ....
লেসেলি

@ লেসলি - দুটি প্রশ্নের মধ্যে কোনও পার্থক্য নেই। তারা একই ফলাফল সেট ফিরে আসবে। আমি শুধু ব্যবহারের অপছন্দ *... ওপি তার নিজের প্রশ্নের উত্তর কিন্তু, আমি শুধু যাচাই করছি এটি সঠিক :) এমনকি এটি পরীক্ষা করতে মনে হয়নি fredosaurus.com/notes-db/select/groupby.html
ওবেদের

আবার আমি যা আশা করেছিলাম তা নয়, তবে মনে হয় এটিই সেরা সমাধান ..;) ধন্যবাদ
স্ট্যাভ্রোস

149

আপনি ব্যবহার করতে পারেন COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT town) 
FROM user

3
কবজ হিসাবে কাজ করে ... প্রধান উত্তরটি বেছে নেওয়া উচিত .. কিছু তদন্ত ছাড়া এটি ভাল নয়।
ভিক্টর

2
আমি মনে করি আপনি যেখানে ক্লিয়ার (COUNT টি DISTINCT শহর) স্থাপন করেছেন তার অর্থ। কারণ এটি একটি সামগ্রিক ফাংশন এবং হাভিং ক্লজটিতে সরবরাহ করা দরকার। এই এসকিউএল কোয়েরিটি কয়েকটিকে বিভ্রান্ত করছে যেহেতু নির্বাচন COUNT (DISTINCT টাউন) একটি অন্তর্নিহিত গ্রুপে রূপান্তরিত হয় COUNT এবং DISTINCT উভয় কীওয়ার্ডের কারণে, প্রতিটি নিজস্ব কীওয়ার্ডও স্পষ্টভাবে গোষ্ঠীভূত করবে।
উঃ গ্রিনস্মিথে

ধন্যবাদ। ভোট দিন। ঠিক কী প্রয়োজন - গ্রুপ + এক বিকল্পে গণনা করুন এবং ফলস্বরূপ একটি একক সারি পান।
সবুজ

ছি .. আমি জানতাম না যে সম্ভব!
হুগো এস মেন্ডেস

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

37

অন্য উপায়টি হ'ল:

/* Number of rows in a derived table called d1. */
select count(*) from
(
  /* Number of times each town appears in user. */
  select town, count(*)
  from user
  group by town
) d1

5
অন্যথায় মাইএসকিএল-এ কাজ করতে না পারলে তার নাম প্রয়োজন। () আগ্রা
আমাস

4

ওরাকল দিয়ে আপনি বিশ্লেষণমূলক ফাংশন ব্যবহার করতে পারেন:

select town, count(town), sum(count(town)) over () total_count from user
group by town

আপনার অন্যান্য বিকল্পগুলি হল সাবকিউরি ব্যবহার করা:

select town, count(town), (select count(town) from user) as total_count from user
group by town

শেষের মতো কিছু কাজ করবে, তবে আমি দেখতে চেয়েছিলাম অন্য কোনও সমাধান আছে কিনা ..
স্ট্যাভ্রোস

এবং আপনি কি প্রথম (বিশ্লেষণমূলক ফাংশন) বিকল্পটি ব্যবহার করতে পারবেন না? আপনি কোন ডাটাবেস প্ল্যাটফর্মটি ব্যবহার করছেন?
টমমি

@ স্ট্যাভ্রস: শেষটি ধীরে ধীরে
মাইকেল বুয়েন

4

আপনি যদি গণনা অনুসারে অর্ডার করতে চান (সহজ শব্দ তবে এটি কীভাবে করা যায় তার স্ট্যাকের কোনও উত্তর আমি খুঁজে পাচ্ছি না) আপনি করতে পারেন:

        SELECT town, count(town) as total FROM user
        GROUP BY town ORDER BY total DESC

4

মুছে ফেলা দশটি উত্তর; বেশিরভাগ ব্যবহারকারী যা বলেছিলেন তা করেন না । বেশিরভাগ উত্তরগুলি এই প্রশ্নের ভেবে ভুলভাবে পড়েছিল যে প্রতিটি শহরে মোট 58 টির পরিবর্তে 58 জন ব্যবহারকারী রয়েছেন। এমনকি যে কয়েকটি সঠিক, সেগুলিও অনুকূল নয়।

mysql> flush status;
Query OK, 0 rows affected (0.00 sec)

SELECT  province, total_cities
    FROM       ( SELECT  DISTINCT province  FROM  canada ) AS provinces
    CROSS JOIN ( SELECT  COUNT(*) total_cities  FROM  canada ) AS tot;
+---------------------------+--------------+
| province                  | total_cities |
+---------------------------+--------------+
| Alberta                   |         5484 |
| British Columbia          |         5484 |
| Manitoba                  |         5484 |
| New Brunswick             |         5484 |
| Newfoundland and Labrador |         5484 |
| Northwest Territories     |         5484 |
| Nova Scotia               |         5484 |
| Nunavut                   |         5484 |
| Ontario                   |         5484 |
| Prince Edward Island      |         5484 |
| Quebec                    |         5484 |
| Saskatchewan              |         5484 |
| Yukon                     |         5484 |
+---------------------------+--------------+
13 rows in set (0.01 sec)

SHOW session status LIKE 'Handler%';

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_commit             | 1     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_external_lock      | 4     |
| Handler_mrr_init           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 3     |
| Handler_read_key           | 16    |
| Handler_read_last          | 1     |
| Handler_read_next          | 5484  |  -- One table scan to get COUNT(*)
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 15    |
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 14    |  -- leapfrog through index to find provinces  
+----------------------------+-------+

ওপি'র প্রসঙ্গে:

SELECT  town, total_users
    FROM       ( SELECT  DISTINCT town  FROM  canada ) AS towns
    CROSS JOIN ( SELECT  COUNT(*) total_users  FROM  canada ) AS tot;

যেহেতু কেবল এক সারি থেকে tot, CROSS JOINযেমন বৃহদায়তন এটি অন্যথায় হতে পারে যেমন নয়।

স্বাভাবিক প্যাটার্নটি COUNT(*)পরিবর্তে হয় COUNT(town)। পরেরটি townশূন্য না হওয়ার জন্য পরীক্ষা করা বোঝায় যা এই প্রসঙ্গে অপ্রয়োজনীয়।


2

মিল্ডোভস্কি যা বলেছিল তার মতো আপনি COUNT এর মধ্যে DISTINCT ব্যবহার করতে পারেন

আমার ক্ষেত্রে:

select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);

এটি একই ব্যবহারকারীর_আইডিটিকে একটি গণনা হিসাবে বিবেচিত উত্তর ভোটের গণনা টানবে


2

আমি জানি এটি এসকিউএল সার্ভারে একটি পুরাতন পোস্ট:

select  isnull(town,'TOTAL') Town, count(*) cnt
from    user
group by town WITH ROLLUP

Town         cnt
Copenhagen   58
NewYork      58
Athens       58
TOTAL        174

5
পুরানো পোস্টগুলির উত্তর দেওয়ার ক্ষেত্রে কোনও ভুল নেই। তবে দয়া করে আপনার কোডের পাশাপাশি কোডের একটি ব্যাখ্যাও অন্তর্ভুক্ত করুন।
শেলভাকু

মাইএসকিউএল সমতুল্য ( IFNULLপরিবর্তে ISNULL) প্রতিটি শহরের জন্য বিভিন্ন সংখ্যা নিয়ে যায়; ব্যবহারকারী মোট চেয়েছিলেন। প্রশ্ন অনুসারে, 58, 174 নয়, মোট।
রিক জেমস

1

আপনি যদি শহর এবং মোট ব্যবহারকারীর সংখ্যা নির্বাচন করতে চান তবে আপনি নীচে এই ক্যোয়ারীটি ব্যবহার করতে পারেন:

SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;

এটি ধরে নিয়েছে (সম্ভবত যুক্তিসঙ্গতভাবে) সেখানে কোনও সদৃশ "ব্যবহারকারী" নেই User
রিক জেমস

1

আপনি যদি গণনা বিকল্পের সাথে সমস্ত প্রশ্ন নির্বাচন করুন ব্যবহার করতে চান তবে এটি চেষ্টা করুন ...

 select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name  as a where where Condition

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

0

নিম্নলিখিত কোড ব্যবহার করে দেখুন:

select ccode, count(empno) 
from company_details 
group by ccode;

আমরা প্রতিটি কোডকো (কোম্পানির কোড) তে বর্তমান ক্যালকের জন্য মোট কর্মচারী খুঁজে পেতে এই কোডটি ব্যবহার করি উদাহরণস্বরূপ: সেকোড 1 এর জন্য গণনা (এমপ্নো) 1839 এবং কোড (এমপ্নো) সেকোড 47 এর জন্য 9421।
বালাজিবরান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.