एक ही चुनिंदा स्टेटमेंट के द्वारा काउंट और ग्रुप का उपयोग कैसे करें


223

मेरे पास एक sql चयन क्वेरी है जिसके पास एक समूह है। मैं बयान के बाद समूह के सभी रिकॉर्डों को गिनना चाहता हूं। क्या इसके लिए सीधे sql से कोई रास्ता है? उदाहरण के लिए, उपयोगकर्ताओं के साथ एक तालिका रखने के लिए मैं विभिन्न शहरों और उपयोगकर्ताओं की कुल संख्या का चयन करना चाहता हूं

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

मैं सभी कस्बों के साथ एक कॉलम और सभी पंक्तियों में उपयोगकर्ताओं की संख्या के साथ एक और करना चाहता हूं।

कुल 3 शहरों और 58 उपयोगकर्ताओं के लिए परिणाम का एक उदाहरण है:

Town         Count
Copenhagen   58
NewYork      58
Athens       58

आपका मतलब है कि आप चाहते हैं कि आपका परिणाम कस्बों के लिए 2 और उपयोगकर्ताओं के लिए एक हो?
लेस्ली

2
तो आप प्रत्येक शहर के लिए एक पंक्ति चाहते हैं, और प्रत्येक पंक्ति में, कॉलम 2 में सभी उपयोगकर्ताओं की कुल संख्या है? तो कॉलम 2 में प्रत्येक पंक्ति के लिए समान मूल्य है? यदि आप नमूना डेटा और आवश्यक आउटपुट शामिल करने के लिए संपादित करते हैं, तो हम आपको वही दे पाएंगे जो आप चाहते हैं।
आकाशवाणी

आप सही आकाशवाणी हैं! मैंने अभी इसे संपादित किया है।
स्टावरोस

2
संबंधित प्रश्न: stackoverflow.com/questions/5146978/…
दूधोवस्की

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

ठीक यही ओपी ने लिखा है? nvm, मुझे आपका अंतर दिखाई दे रहा है, आप टाउन नॉट काउंट कर रहे हैं ....
लेस्ली

@ लेस्ली - दोनों प्रश्नों में कोई अंतर नहीं है। वे उसी परिणाम सेट को वापस करेंगे। मैं इसके इस्तेमाल को नापसंद करता हूं *... ओपी ने अपने ही सवाल का जवाब दिया, लेकिन इसका परीक्षण भी नहीं किया, मैं सिर्फ यह सत्यापित कर रहा हूं कि यह सही है :) fredosaurus.com/notes-db/select/groupby.html
Oded

फिर से जो मैंने आशा की थी, लेकिन ऐसा लगता है कि यह सबसे अच्छा समाधान है ..;) धन्यवाद
स्टावरोस

149

आप उपयोग कर सकते हैं COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT town) 
FROM user

3
एक आकर्षण के रूप में काम करता है ... मुख्य उत्तर को चुना जाना चाहिए .. कुछ जांच को छोड़कर कि यह अच्छा नहीं है।
विक्टर

2
मुझे लगता है कि अगर आप COUNT (DISTINCT शहर) को WHERE क्लॉज में रखते हैं तो इसका मतलब है। ऐसा इसलिए है क्योंकि यह एक समग्र कार्य है और इसे HAVING क्लॉज में प्रदान करने की आवश्यकता है। यह SQL क्वेरी कुछ के लिए भ्रामक है क्योंकि SELECT COUNT (DISTINCT टाउन) एक अंतर्निहित ग्रुप BY में बदल जाता है, COUNT और DISTINCT दोनों कीवर्ड्स के कारण, प्रत्येक कीवर्ड का स्वयं का भी अंतर्निहित समूह होगा।
ए। ग्रीनस्मिथ

धन्यवाद। वोट दें। वास्तव में क्या आवश्यक है - समूह + एक सेशन में गिनें और परिणाम में एक पंक्ति प्राप्त करें।
ग्रीन

शिट .. मुझे नहीं पता था कि यह संभव था!
ह्यूगो एस। मेंडेस

1
@milkovsky - नहीं, आपको इसे हटाने की आवश्यकता नहीं है। मुझे बस यह जलन लगती है कि यह प्रश्न और कई उत्तरों ने दो अलग-अलग समस्याओं को हल करने में द्विभाजित किया है। आपका उत्तर दो तरह से विचलित होता है - कोई 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
जरूरत है उर्फ ​​अन्यथा mysql में काम नहीं करेगा।
अमास

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

पिछले काम की तरह कुछ, लेकिन मैं देखना चाहता था कि क्या कोई अन्य समाधान है ..
स्टावरोस

और क्या आप पहले (विश्लेषणात्मक फ़ंक्शन) विकल्प का उपयोग नहीं कर सकते हैं? आप किस डेटाबेस प्लेटफ़ॉर्म का उपयोग कर रहे हैं?
टॉमी

@Stavros: पिछले एक धीमी है
माइकल

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);

यह एक ही user_id को एक गिनती के रूप में माना जाने वाले उत्तर मतों की गिनती को खींच देगा


2

मुझे पता है कि यह एक पुराना पोस्ट है, SQL सर्वर में:

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
पुरानी पोस्ट का जवाब देने में कुछ भी गलत नहीं है। हालाँकि, कृपया अपने कोड के साथ-साथ कोड का स्पष्टीकरण भी शामिल करें।
शेल्वैकु

MySQL समकक्ष (के 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;

हम इस कोड का उपयोग यह जानने के लिए करते हैं कि प्रत्येक और हर ccode (कंपनी कोड) उदाहरण में कितने कुल कर्मचारी हैं: काउंट (एम्प्नो) ccode 1 के लिए 1839 है और काउंट 47 के लिए काउंट (empno) 9421 है।
बैलाजरन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.