2011-12-15 87 views
1

我需要編寫一個SQL語句,它可以返回指示三件事情的列。三件事是'實際的班級','多個班級','沒有選擇班級'。我已經使用了一個函數來獲取這個,但隨着表記錄的增長,這種方法有所減慢。有人能告訴我如何做到這一點,而不會犧牲速度,當記錄的數量增長?我認爲某種類型的案件可以統計在一起,但無法弄清楚。在SQL Statement中一起使用CASE和COUNT

我需要返回的數據看起來像這樣。

 
Student   Classes 
Bugs Bunny  Multiple Classes 
Daffy Duck  Biology 101 
Porky Pig  No Classes Selected 
 
Schema 

Student 
StudentId int 
Name 

Class 
ClassId int 
Name 

StudentClass 
StudentId 
ClassId 
+3

你能編輯的問題,包括模式/基礎數據對應於您提供的輸出? – 2011-12-15 14:53:51

+2

你可以發佈你已經使用的函數嗎(一切都有點假設,沒有更多關於表結構的想法) – 2011-12-15 14:53:58

+0

對不起,忘記了模式。我的模式與第一個答案中發佈的相同。 – 2011-12-15 15:55:26

回答

1

另一個版本,與前兩個非常相似;更少的連接,每個學生最多隻能查看一個類(可能會影響真正的大型表)。

SELECT 
    xx.Name 
    ,case xx.ClassCount 
    when 0 then 'No Classes Selected' 
    when 1 then cl.Name 
    else 'Multiple Classes' 
    end Classes 
from (-- Count classes per student 
     select 
      st.Name 
     ,count(sc.ClassId) ClassCount 
     ,max(sc.ClassId) OneClass -- If a student has one class, this is it 
     from Students st 
     left outer join StudentClass sc 
      on sc.StudentId = st.StudentId 
     group by st.Name) xx 
    left outer join Classes cl 
    on cl.ClassId = xx.OneClass 

(不能調試,幸而沒有錯別字......)

(不能調試,幸而沒有更多錯別字......)

0

你的架構應該是這樣的

Student 
StudentId int 
Name 

Class 
ClassId int 
Name 

StudentClass 
StudentId 
ClassId 

然後將查詢看起來像:

select 
    s.Name, 
    CASE x.ClassCount when 0 then 'No Classes Selected' when 1 then c.Name else 'Multiple Classes' 
from 
    Student s 
    inner join 
(select 
    StudentId, count(sc.ClassId) as ClassCount 
from 
    Student s 
    left outer join StudentClass sc on s.StudentId = sc.StudentId 
group by 
    s.StudentId) x on s.StudentId = x.StudentId 
    left outer join StudentClass sc2 on sc2.StudentId = x.StudentId and x.ClassCount = 1 
    left outer join Class c on c.ClassId = sc2.ClassId 
+0

對不添加架構,但你展示的是我所擁有的。不幸的是,我得到'無效的列名稱ClassCount'。 – 2011-12-15 15:48:36

0

我想看看使用子查詢,以獲得學生證當只有一個時,班級計數再次查找班級名稱,如下所示:

Select s.Name, 
    Case s.Count 
     When 0 Then 'No Classes Selected' 
     When 1 Then c.className 
     Else 'Multiple Classes' 
    End 
From (
    select s.id, s.name, count(cs.id) as Count 
    From student s 
    left join studentclass cs on c.studentid = s.id 
    group by s.id, s.name 
) as s 
left join studentclass cs on c.studentid = s.id 
left join class c on c.id = cs.classid 

當然,即時學校,子查詢可以分解成一個公共表格表達式(CTE)。