2016-05-01 73 views
2

我學習一個SQL測試和上一年有最後一個問題:返回統計數的MIN()()

名誰研究論文數最少的學生。他們研究了多少份 論文?

到目前爲止,這是我所創建的選擇查詢:

select min(Full_Name), min(Amount) 
from (select st.ST_F_Name & ' ' & st.ST_L_Name as Full_Name, count(*) as Amount 
from (student_course as sc 
inner join students as st 
on st.ST_ID=sc.SC_ST_ID) 
group by st.ST_F_Name & ' ' & st.ST_L_Name) 

這完全適用回來時,我想要的結果,但我不知道這是我的方式應該正在做這個查詢?我覺得在Full_Name上調用min()會在某些情況下對我產生潛在的影響。有沒有更好的方法來做到這一點? (這是在MS Access原因不明)

+0

這樣做,因爲在這種情況下只有一個學生返回。但是如果我有多個學生的論文數量最少的話呢?據我所知,這隻會返回一個學生,而不會返回其他人。我怎麼寫它,如果有多個,它會返回所有這些? – Syzorr

+0

有兩種可能性:1.使用不存在具有較高讀取論文數的學生,2.找到最小值並再次與計數表一起獲得具有該數量的學生名稱。如果沒有「with」,兩個查詢都很煩人。 – maraca

+0

順便說一句,在這個問題本身是不一致的:「學生」和「有」是單數,但「有」和「他們」是複數。 (我們希望使用'with',因爲這兩種方法都使用計數向中間表引用兩次,那麼我們不必再編寫兩次。) – maraca

回答

1

如果你想只有這樣的學生1,如果有多個,這可能是最簡單的:

select st.ST_F_Name, st.ST_L_Name, count(*) as Amount 
from student_course as sc 
inner join students as st 
on st.ST_ID=sc.SC_ST_ID 
group by st.ST_ID 
order by Amount ASC LIMIT 1 

但是,如果你想找到所有 stuch同學,你遵循了不同的方法。我們使用WITH子句來簡化事物,定義了一個CTE(公用表表達式)來計算每個學生的課程數量。然後我們選擇的學生,他們的數量等於最低在CTE:

with per_student as (
select st.ST_F_Name, st.ST_L_Name, count(*) as Amount 
from student_course as sc 
inner join students as st 
on st.ST_ID=sc.SC_ST_ID 
group by st.ST_ID 
) 
select * from per_student 
where amount = (select min(amount) from per_student) 

但在這個問題真正的關鍵是,有可能是沒有采取任何課程的學生。但目前提出的方法你永遠不會看到它們。你想這樣的事情:

with per_student as (
select st.ST_F_Name, st.ST_L_Name, count(sc.SC_ST_ID) as Amount 
from student_course as sc 
right outer join students as st 
on st.ST_ID=sc.SC_ST_ID 
group by st.ST_ID 
) 
select * from per_student 
where amount = (select min(amount) from per_student) 
+0

我不得不稍微改變它,因爲它與MS Access一起工作,但是非常感謝。 With子句在Access中似乎不起作用。 – Syzorr

+1

@Syzorr這是正確的,我之所以沒有將這些評論作爲答案......與查詢。 – maraca

0

您可以通過count(*)爲了得到與論文的至少#學生:

select * from students where st_id in (
    select top 1 sc_st_id 
    from student_course 
    group by sc_st_id 
    order by count(*) 
) 

,如果你也需要的論文#研究,然後再加入含分鐘計數派生表:

select * from students s 
left join (
    select top 1 sc_st_id, count(*) 
    from student_course 
    group by sc_st_id 
    order by count(*) 
) t on t.sc_st_id = s.st_id 
+1

如果多個代碼最少文件。 – Syzorr