SQL में किसी स्तंभ मान की घटनाओं को कुशलता से कैसे गिना जाए?


166

मेरे पास छात्रों की एक तालिका है:

id | age
--------
0  | 25
1  | 25
2  | 23

मैं सभी छात्रों के लिए क्वेरी करना चाहता हूं, और एक अतिरिक्त कॉलम जो मायने रखता है कि कितने छात्र एक ही उम्र के हैं:

id | age | count
----------------
0  | 25  | 2
1  | 25  | 2
2  | 23  | 1

ऐसा करने का सबसे कुशल तरीका क्या है? मुझे डर है कि एक उप-क्वेरी धीमी होगी, और मैं सोच रहा हूं कि क्या कोई बेहतर तरीका है । है?

जवाबों:


256

यह काम करना चाहिए:

SELECT age, count(age) 
  FROM Students 
 GROUP by age

यदि आपको आईडी की आवश्यकता है, तो आप उपरोक्त को उप क्वेरी के रूप में शामिल कर सकते हैं:

SELECT S.id, S.age, C.cnt
  FROM Students  S
       INNER JOIN (SELECT age, count(age) as cnt
                     FROM Students 
                    GROUP BY age) C ON S.age = C.age

2
दूसरी क्वेरी के लिए, बाहरी चयन C.cnt पर होना चाहिए क्योंकि S.cnt नहीं है, अन्यथा आपको एक त्रुटि मिलती है: अमान्य कॉलम नाम 'cnt'
KM।

1
जब मैं pgm_code द्वारा pgm समूह से चुनिंदा case_id, count (pgm_code) का उपयोग कर रहा हूं, तो मेरे लिए इसकी त्रुटि दे रहा है; यह अभिव्यक्ति द्वारा समूह नहीं कह रहा है
ऋषभ अग्रवाल

26

यदि आप ओरेकल का उपयोग कर रहे हैं, तो एनालिटिक्स नामक एक सुविधा चाल करेगी। यह इस तरह दिख रहा है:

select id, age, count(*) over (partition by age) from students;

यदि आप Oracle का उपयोग नहीं कर रहे हैं, तो आपको वापस काउंट्स में शामिल होना होगा:

select a.id, a.age, b.age_count
  from students a
  join (select age, count(*) as age_count
          from students
         group by age) b
    on a.age = b.age

2
FYI करें, SQL सर्वर 2005 पर, दूसरी क्वेरी लगभग आधी निष्पादन लागत ( SET SHOWPLAN_ALL ON का उपयोग करके ) पहले के रूप में चलती है । मुझे लगा कि पहले बेहतर होगा, लेकिन पुराने स्कूल ने इसे हरा दिया।
के.एम.

1
"पुराना स्कूल जॉइन इट बीट" बस इसलिए कि संसाधित किया जाने वाला TOTAL ROW COUNT अलग है। दूसरी क्वेरी में, अंतर्निहित समूह-द्वारा है जो संभावित रूप से पंक्तियों की संख्या को कम करता है। पहली क्वेरी में DISTINCT को जोड़ने का प्रयास करें: "DISTINCT id, आयु, संख्या (छात्रों से उम्र के अनुसार विभाजन) का चयन करें" - कि तुलनीय होना चाहिए
quetzalcoatl

19

यहाँ एक और उपाय है। यह एक बहुत ही सरल वाक्यविन्यास का उपयोग करता है। स्वीकृत समाधान का पहला उदाहरण Microsoft SQL के पुराने संस्करणों पर काम नहीं करता (अर्थात 2000)

SELECT age, count(*)
FROM Students 
GROUP by age
ORDER BY age

1
यदि आप उम्र के हिसाब से समूह बनाते हैं, तो आपको केवल २५ वर्ष की आयु में २ की गिनती के साथ एक प्रविष्टि मिलेगी (जब वे वास्तव में २ की गिनती के साथ २ प्रविष्टियाँ चाहते हैं और दिए गए उदाहरण के लिए अलग आईडी है)?
इयान

1
इयान, प्रतिक्रिया के लिए धन्यवाद। क्या आपने MS SQL 2000 DB के खिलाफ अपने दावे को अंजाम दिया?
दामियन

7

मैं कुछ ऐसा करूंगा:

select
 A.id, A.age, B.count 
from 
 students A, 
 (select age, count(*) as count from students group by age) B
where A.age=B.age;

4
select s.id, s.age, c.count
from students s
inner join (
    select age, count(*) as count
    from students
    group by age
) c on s.age = c.age
order by id

1

और यदि "आयु" कॉलम के डेटा में समान रिकॉर्ड हैं (अर्थात कई लोग 25 वर्ष के हैं, तो कई अन्य 32 और इसी तरह के हैं), यह प्रत्येक छात्र के लिए सही गणना को संरेखित करने में भ्रम का कारण बनता है। इससे बचने के लिए, मैंने छात्र आईडी पर तालिकाओं में भी शामिल हो गया।

SELECT S.id, S.age, C.cnt
FROM Students S 
INNER JOIN (SELECT id, age, count(age) as cnt  FROM Students GROUP BY student,age) 
C ON S.age = C.age *AND S.id = C.id*
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.