2013-04-11 68 views
1

有沒有辦法選擇除group by子句中指定的列以外的列? 比方說,我有以下模式:選擇GROUP BY子句中指定的列以外的列

學生(ID,姓名,年齡),場(ID,姓名,信用卡號),報名(student_id數據,COURSE_ID,等級)

我想查詢每門課程如下:課程名稱,student_count。

我想出瞭解決辦法,但我不知道是否有這樣做更清潔的方式:

SELECT MAX(c.name), COUNT(distinct e.student_id) 
FROM Enrollment e 
INNER JOIN Course c ON c.id = e.course_id 
GROUP BY e.course_id; 
+0

您應該發佈每個表的一些示例數據和所需的結果。 – Taryn 2013-04-11 19:47:24

回答

1

不,你不能。但是你可以用c.name擴展GROUP BY

SELECT MAX(c.name), COUNT(distinct e.student_id) 
FROM Enrollment e 
INNER JOIN Course c ON c.id = e.course_id 
GROUP BY e.course_id, c.name 

因爲e.course_id是獨一無二的,它不會改變結果。

+0

對!我沒有想到這一點!但是如果模式更復雜呢?假設我有Employee(id,name,salary),Department(id,name,manager_id)和WorksIn(employee_id,department_id),我想要做類似的查詢。這是爲每個部門,找到統計,部門名稱,經理姓名,經理薪水。 (其中manager_id引用員工)我想知道如果我做'GROUP BY d.did,m.name,m.salary',我會得到正確的結果嗎? – 0x56794E 2013-04-11 19:46:18

+0

是的,你應該得到正確的結果。 – MarcinJuraszek 2013-04-11 19:47:50

+0

所以既然d.did是唯一的,那麼在這種情況下,事情並不重要? – 0x56794E 2013-04-11 19:50:22

2

您可能需要複製此DDL,將其調整爲與您的架構相匹配,然後將其粘貼到您的問題中。

create table Student(
    student_id integer primary key, 
    student_name varchar(35) not null, 
    age int not null default 20 
); 

create table Course(
    course_id integer primary key, 
    course_name varchar(35) not null, 
    credit integer not null default 3 
); 

create table Enrollment(
    student_id integer not null references Student (student_id), 
    course_id integer not null references Course (course_id), 
    primary key (student_id, course_id), 
    grade char(1) not null 
); 

insert into student values 
(1, 'a', 20), 
(2, 'b', 20), 
(3, 'c', 20); 

insert into course values 
(1, 'course 1', 3), 
(2, 'course 2', 3), 
(3, 'course 3', 3); 

insert into enrollment values 
(1, 1, 'b'), 
(2, 1, 'b'), 
(3, 1, 'b'), 
(1, 2, 'b'), 
(2, 2, 'b'), 
(3, 3, 'b'); 

現在,通過查詢「註冊」表,您可以獲得每門課程註冊的學生人數。

select course_id, count(student_id) num_students 
from enrollment 
group by course_id 
order by course_id; 

course_id num_students 
-- 
1   3 
2   2 
3   1 

剩下的就是得到相應的課程名稱。要做到這一點,您只需將表格「課程」加入我們剛纔編寫的查詢中即可。