मैं एसक्यूएल के लिए नया हूं इसलिए उम्मीद है कि इसका एक आसान जवाब है।

मेरे पास एक छात्र तालिका (छात्र आईडी, नाम, स्थिति आईडी) और एक छात्र वर्ग तालिका (छात्र आईडी, कक्षा आईडी) है। मुझे उपरोक्त तालिकाओं से एक दृश्य बनाने के लिए कहा गया है जो निम्नलिखित कॉलम लौटाता है:

<मजबूत> classID: (समूह-दर)

छात्रों के रूप में प्रत्येक कक्षा में छात्रों की संख्या

छात्रों की संख्या जहां statusID = 1 सक्रिय के रूप में

छात्रों की संख्या जहां statusID = 2 निष्क्रिय के रूप में

मैं कक्षा आईडी कॉलम द्वारा आसानी से समूहबद्ध कर सकता हूं और छात्रों की संख्या गिन सकता हूं, लेकिन मुझे नहीं लगता कि गिनती फ़ंक्शन को केवल कुछ पंक्तियों को गिनने के लिए कहा जा सकता है। जैसे ही मैं जोड़ता हूं या क्लॉज रखता हूं, मैं रिकॉर्ड खो देता हूं कि मुझे अन्य कॉलम में गिना जाना चाहिए। क्या मुझे कुछ अलग-अलग प्रश्न लिखने और फिर प्रत्येक के परिणामों में शामिल होने की आवश्यकता है?

आप जो भी मदद दे सकें मैं उसका आभारी होऊंगा!

डेविड

1
David 18 जून 2010, 21:58
1
क्या यह एसक्यूएल या माइस्क्ल है? और आप किस भाषा का प्रयोग कर रहे हैं? उदाहरण: पीएचपी
 – 
Zuul
18 जून 2010, 22:00
- MSSQL 2005 (नया दृश्य), ASP.NET पृष्ठ दृश्य का उपयोग करेगा।
 – 
David
18 जून 2010, 23:21

3 जवाब

सबसे बढ़िया उत्तर

यह एएनएसआई एसक्यूएल है (जब तक आपका एसक्यूएल कार्यान्वयन एएनएसआई संगत है तब तक काम करना चाहिए):

SELECT 
 classID,
 COUNT(*) AS "Students",
 SUM(CASE statusID WHEN 1 THEN 1 ELSE 0 END) AS "Actives",
 SUM(CASE statusID WHEN 2 THEN 1 ELSE 0 END) AS "Inactives",
FROM StudentsClasses class
INNER JOIN Students stud ON class.studentID = stud.studentID
GROUP BY classID
7
David 18 जून 2010, 22:10
विशेष रूप से टीएसक्यूएल कुछ भी नहीं - यह सब एएनएसआई है
 – 
OMG Ponies
18 जून 2010, 22:11
स्पष्टीकरण के लिए कूल thx, मैंने केवल टी-एसक्यूएल का उपयोग किया है, इसलिए अगर मैं कुछ गैर-मानक का उपयोग कर रहा था तो बस उस आधार को कवर करना चाहता था। (मैंने स्पष्ट करने के लिए उत्तर संपादित किया)
 – 
David
18 जून 2010, 22:12
1
डार, यह वही जवाब है जिसके साथ मैं आया था। बहुत बुरा मैंने पहले कुछ मिनटों के लिए विश्व कप देखने के लिए समय निकाला। अच्छा जवाब!
 – 
William Salzman
18 जून 2010, 22:54
बहुत चालाक! :) महान उत्तर के लिए बहुत बहुत धन्यवाद!
 – 
David
18 जून 2010, 23:13

गिनने के बजाय, आप कुछ IIF/CASE कथनों को सारांशित करने का प्रयास क्यों नहीं करते? यानी आईआईएफ का उपयोग करते हुए, आपकी क्वेरी होगी:

SELECT ClassId, COUNT(*) AS students,
       SUM(IIF(StatusId = 1, 1, 0)) as Actives,
       SUM(IIF(StatusId = 2, 1, 0)) as Inactives
FROM StudentsClasses
INNER JOIN Students ON StudentsClasses.StudentID = Students.StudentID
GROUP BY ClassId
1
lc. 20 जून 2010, 17:56
टॉड साल्ज़मैन - इसके अलावा कहने के लिए बहुत कुछ नहीं है: "वाह, क्षमा करें, मैंने उत्तर दिया कि ओपी को क्या परेशानी हो रही थी, लेकिन पूरी क्वेरी को चम्मच से नहीं मिला। मुझे पूरा यकीन है कि ओपी जानता है कि उसकी तालिकाओं में कैसे शामिल होना है। एक साथ; वह विशेष रूप से पूछ रहा था कि Actives और Inactives गिनती कैसे प्राप्त करें। ओह, और मुझे थोड़ा आश्चर्य भी है कि आपने नीचे -1 @ ब्रेंडन लॉन्ग का जवाब नहीं दिया, जो तालिका का उपयोग करता है students जहां इसे studentsclasses का उपयोग करना चाहिए, लेकिन जो भी हो।"
 – 
lc.
20 जून 2010, 17:56

इस तरह का एक बयान आपको प्रत्येक कक्षा के लिए एक कक्षा आईडी और उसमें छात्रों की संख्या के साथ एक पंक्ति देगा।

SELECT classID, COUNT(*) AS studentsInClass
    FROM students
    WHERE classID
    IN (SELECT DISTINCT classID FROM students)
    GROUP BY classID

WHERE x IN (...) चीज कुछ ऐसी है जो मैंने अभी सीखी है।

मैं वास्तव में दूसरे भाग के बारे में निश्चित नहीं हूँ। क्या आप यह सब एक टेबल में चाहते हैं? आप इसमें UNION कर सकते हैं, लेकिन यह गड़बड़ होगी क्योंकि डेटा समान नहीं है।

0
Brendan Long 18 जून 2010, 22:18