2014-10-08 16 views
0

我需要知道是否存在執行此查詢的另一種方法。查詢性能調優 - 搜索其他選項

EXAMS有這樣的結構:

EXAM_DATE DATE 
SUBJECT VARCHAR2(50); 
GRADE NUMBER; 

的概念是獲得考試的統計數據。

select EXAM_DATE, 
     SUBJECT,   
     (SELECT COUNT(1) 
      from EXAMS 
      where GRADE IN (9,10) 
      AND SUBJECT = EXA.SUBJECT 
      AND EXAM_DATE = EXA.EXAM_DATE) outstanding, 
     (select count(1) 
      from EXAMS 
      where GRADE IN (4,5,6,7,8) 
      AND SUBJECT = EXA.SUBJECT 
      AND EXAM_DATE = EXA.EXAM_DATE) approved, 
     (select count(1) 
      from EXAMS 
      where GRADE IN (0,1,2,3) 
      AND SUBJECT = EXA.SUBJECT 
      AND EXAM_DATE = EXA.EXAM_DATE) disapproved, 
FROM EXAMS EXA 
GROUP BY EXAM_DATE,SUBJECT; 

謝謝!!

+0

你有什麼問題的表現? – Matt 2014-10-08 15:39:54

回答

3

只要使用條件聚合。無需子查詢:

select EXAM_DATE, SUBJECT,   
     SUM(GRADE IN (9,10) THEN 1 ELSE 0 END) as outstanding, 
     SUM(GRADE IN (4,5,6,7,8) THEN 1 ELSE 0 END) as approved, 
     SUM(GRADE IN (0,1,2,3) THEN 1 ELSE 0 END) as disapproved, 
FROM EXAMS EXA 
GROUP BY EXAM_DATE, SUBJECT; 
0

我可能會使用一個PIVOT得到的結果,因爲你是在一列轉換值(gradeNumber)到值一排(gradenumbers的計數)。試試這個:

-- make and fill an example table 
DECLARE @Exams TABLE 
(Exam_Date  DATE 
,[Subject]  VARCHAR(250) 
,GradeNumber INT) 

INSERT @Exams VALUES ('2014-01-15','Escapology',1) 
INSERT @Exams VALUES ('2014-01-15','Escapology',9) 
INSERT @Exams VALUES ('2014-01-15','Escapology',5) 
INSERT @Exams VALUES ('2014-01-15','Escapology',3) 
INSERT @Exams VALUES ('2014-01-16','Art',8) 
INSERT @Exams VALUES ('2014-01-16','Art',7) 
INSERT @Exams VALUES ('2014-01-16','Chemistry',0) 
INSERT @Exams VALUES ('2014-01-16','Chemistry',5) 
INSERT @Exams VALUES ('2014-01-16','Chemistry',9) 
INSERT @Exams VALUES ('2014-01-16','Chemistry',2) 
INSERT @Exams VALUES ('2014-01-17','Maths',5) 
INSERT @Exams VALUES ('2014-01-17','Maths',6) 
INSERT @Exams VALUES ('2014-01-18','Geology',10) 

-- set up the grade boundaries 
DECLARE @A INT = 9 
DECLARE @B INT = 4 
DECLARE @C INT = 0 

-- get the count of grades by exam and date 
SELECT * FROM 
(SELECT 
    Exam_Date 
    -- list the exam date twice as one will be used to make the count 
    ,Exam_Date AS ExamDate 
    ,[Subject] 
    ,CASE WHEN GradeNumber >= @A THEN 'Outstanding' 
     WHEN GradeNumber >= @B THEN 'Approved' 
     ELSE 'Disapproved' END AS Result 
FROM @Exams) AS Up 
PIVOT (COUNT(Exam_Date) FOR Result IN ([Outstanding],[Approved],[Disapproved])) AS PVT 
+0

我看到我的解決方案已被標記爲答案,但看到戈登的,我會採取他的,更簡單的方法在我的,儘管我肯定會參數化等級邊界,所以使用... SUM(CASE WHERE GradeNumber> = @A THEN 1 ELSE 0 END)未完成......等等。 – 2014-10-08 16:12:32