2010-08-06 45 views
1

這裏就是我與(SQL Server)的工作:SQL服務器聯接,組等做簡單的數字運算

  • 部門:DEPTID,DEPTNAME
  • 學生:studID ,studName,DEPTID
  • 分配:studID,courseID,狀態

學生被分配到一個部門,學生記錄保存部門的ID號碼。 「任務」是學生與課程(未顯示課程)之間的一種聯繫,具有狀態(不完整,通過,未嘗試)。

我想列出的部門,並與各部門,學生在該部門的總數量和每個人身份轉讓的總數量(見下文,如果這一措辭是混亂的例子。)

理想我會爲每個部門返回一行。當像這樣運行查詢時,這通常是我碰到的一個問題。

示例:一個部門有5個學生和5個課程。恰好爲每個學生分配了5門課程。只有一個學生完成了所有課程,其他學生沒有做任何事情。因此,這個部門的總數不會被嘗試20次,5次通過,0次不完整。

我會很高興的回答,建議在一個非常抽象的水平的SQL ......我只需要知道,如果連接需要嵌套或然而這將工作。

回答

2

喜歡的東西

SELECT departments.deptName, 
     sum(case when status = 'attempted' then 1 else 0 end) as attempted_count, 
     sum(case when status = 'passed' then 1 else 0 end) as passed_count, 
     sum(case when status = 'incomplete' then 1 else 0 end) as complete_count 

FROM departments JOIN students JOIN Assignment 
GROUP BY departments.deptName 

當你只是想的想法,我根本沒有載明的連接條件。

+0

像魅力一樣工作(理論上......實際上沒有對結果進行雙重檢查)。從來沒有像以前那樣使用過這樣的條件。 – Guttsy 2010-08-06 20:57:14

0

這會給你你想要的,除了每個部門的學生數。

SELECT d.deptname, a.status, COUNT(a.status) 
FROM departments d 
JOIN students s ON d.deptid = s.deptid 
JOIN assignment a ON s.studid = a.studid 
GROUP BY d.deptname, a.status 

要添加每個部門的學生數,我可能只是做另一個查詢。在分配狀態分組時,在同一個查詢中執行該操作將非常困難。

+0

每個部門和每個部門都會返回一行,而不是每個部門一個。 – Frank 2010-08-06 20:47:04

+0

正確,但因爲狀態包含在select中,所以將其用於顯示目的很簡單。 – sgriffinusa 2010-08-06 20:48:56

0

這樣的事情呢?

SELECT 
    D.deptName, A.status, 
    COUNT(*) AS statusCount, 
    COUNT(DISTINCT(S.studID)) AS studCount 
    FROM departments AS D 
    INNER JOIN students AS S ON D.deptID = S.deptID 
    INNER JOIN assignments AS A ON S.studID = A.studID 
    GROUP BY D.deptName, A.status 
+0

這將給每個部門的學生計數和任務狀態,他要求只按部門進行。 – sgriffinusa 2010-08-06 20:45:52

+0

每個部門和狀態返回一行,而不是每個部門一個。 – Frank 2010-08-06 20:47:43