2011-09-23 68 views
0

我希望它列出的記錄,如果是的總數小於5如何使用在WHERE語句比symble比小於或大於用SUM功能

我得到一個錯誤:

An aggregate may not appear in the WHERE clause unless it is in sub query contained in a HAVING clause or select list , and the column being aggregated is an outer reference

我想列出在WCM103的學生,並且參加了少於5個班。

+0

聚合函數不where子句工作。 –

+0

您可以發佈ATTENDANCE表的結構和數據類型嗎? – Ollie

回答

2

會是這樣的:你

WITH att 
    AS (SELECT studentID, 
      SUM(CASE WHEN attStatus = 'Yes' THEN 1 ELSE 0 END) as att_count 
     FROM attendance 
     GROUP BY studentID) 
SELECT * 
    FROM Attendance a 
INNER JOIN Student s USING (studentID) 
INNER JOIN att USING (studentID) 
WHERE att.att_count < 5 
    AND a.unitcode = 'SIT103'; 

工作?

你可以從你的學生,出席選擇列,你需要等

編輯:我沒有在我面前一個SQL接口tody所以一些SQL語句可能需要調整。

大衛,在新的信息的光,請嘗試以下操作:

WITH att 
    AS (SELECT unitcode, 
      studentID, 
      SUM(CASE WHEN attStatus = 'Yes' THEN 1 ELSE 0 END) as att_count 
     FROM attendance 
     WHERE attdate < TO_DATE('07/08/2011', 'DD/MM/YYYY') 
     GROUP BY unitcode, 
       studentID) 
SELECT * 
    FROM Student s 
INNER JOIN att USING (studentID) 
WHERE att.unitcode = 'SIT103' 
    AND att.att_count < 5; 

我的SQL * Plus現在重新運行。我只是跑:

CREATE TABLE student (
    studentid NUMBER, 
    student_name VARCHAR2(30) 
); 

CREATE TABLE attendance (
    studentid NUMBER, 
    unitcode VARCHAR2(10), 
    attdate DATE, 
    attstatus VARCHAR2(5) 
); 

INSERT INTO student VALUES (2106,'Jo Bloggs'); 
INSERT INTO student VALUES (2108,'Jo Schmoe'); 

INSERT INTO attendance VALUES (2106, 'SIT103', TO_DATE('05/06/2011', 'DD/MM/YYYY'), 'No'); 
INSERT INTO attendance VALUES (2106, 'SIT103', TO_DATE('07/07/2011', 'DD/MM/YYYY'), 'Yes'); 
INSERT INTO attendance VALUES (2106, 'SIT103', TO_DATE('10/05/2011', 'DD/MM/YYYY'), 'Yes'); 
INSERT INTO attendance VALUES (2108, 'SIT203', TO_DATE('05/05/2011', 'DD/MM/YYYY'), 'Yes'); 

WITH att 
    AS (SELECT unitcode, 
      studentID, 
      SUM(CASE WHEN attStatus = 'Yes' THEN 1 ELSE 0 END) as att_count 
     FROM attendance 
     WHERE attdate < TO_DATE('07/08/2011', 'DD/MM/YYYY') 
     GROUP BY unitcode, 
       studentID) 
SELECT studentid, 
     student_name, 
     unitcode 
    FROM Student s 
INNER JOIN att USING (studentID) 
WHERE att.unitcode = 'SIT103' 
    AND att.att_count < 5; 

,並得到:

STUDENTID STUDENT_NAME UNITCODE 
2106   Jo Schmoe SIT103 

哪個是正確的,不是嗎?

+0

YES謝謝..我將如何爲DATE添加一個小於語句。 – David

+0

EG:在2011年7月8日之前出席的課程少於2個 – David

+0

如果您在聚合中按日期進行限制(我認爲您會這樣做),則將WITH子句中的額外子句添加到WITH語句中的WHERE子句中,用於對ATTENDANCE記錄進行分組。 – Ollie

0

嘗試在下面與HAVING替換WHERE爲:

SELECT  * 
FROM   Attendance AS a INNER JOIN 
         Student AS s ON a.studentID = s.studentID 
HAVING  (SUM(CASE WHEN attStatus = 'Yes' THEN 1 ELSE 0 END) < 5) 
+0

不,同樣的錯誤信息 – David

+0

你必須有一個group by子句才能使用 –

1

要使用擁有,您必須有一個group by子句,然後執行group by,並在聚合查詢後充當過濾器。

不確定你想要做一筆總額,但沒有看到表格中的數據,但你應該能夠在出席表中計算出是的數量,然後就會列出符合條件的那些數字

嘗試是這樣的(甲骨文的SQL語法)

SELECT s.studentname, count(*) 
    FROM student s, attendance a 
WHERE s.studentid=a.studentid 
    AND a.class='SIT108' 
    AND a.status='Y' 
GROUP BY s.studentname 
HAVING COUNT(*)<5 

或ANSI語法

SELECT s.studentname, count(*) 
    FROM student s 
    LEFT INNER JOIN attendance a 
    ON s.studentid=a.studentid 
WHERE a.class='SIT108' 
    AND a.status='Y' 
GROUP BY s.studentname 
HAVING COUNT(*)<5 

可以省略頂行的COUNT(*),以及如果你只是想的名單

SELECT s.studentname 
    FROM student s 
    LEFT INNER JOIN attendance a 
    ON s.studentid=a.studentid 
WHERE a.class='SIT108' 
    AND a.status='Y' 
GROUP BY s.studentname 
HAVING COUNT(*)<5 

添加任何額外的where子句或連接的需要

相關問題