2012-08-05 65 views
0

下面是我的查询和它的输出。是否有可能建立我的查询只有一个选择语句(我有两个在我的查询)?它用于性能目的。是否有可能建立我的查询只有一个选择语句?

WITH GradePassFail AS (
    SELECT 
     Subject, 
     Grade, 
     CASE WHEN Grade >= 50 THEN 1 ELSE 0 END AS Pass, 
     CASE WHEN Grade < 50 THEN 1 ELSE 0 END AS Fail 
    FROM Grade_report 
) 
SELECT Subject, MAX(Grade) AS Grade, SUM(Pass) AS Pass, SUM(Fail) AS Fail 
FROM GradePassFail 
GROUP BY Subject 

enter image description here

+1

the数据库将优化语句。如果这可以用单个语句(可以)编写,那么数据库将重写这一个以达到最佳效果。 – 2012-08-05 04:48:48

+0

@kevin - 不要删除问题的细节,以便您的问题也可以帮助其他人。 – Geoffrey 2012-08-05 05:43:36

回答

3

您可以将SUM函数中执行CASE报表合格/不合格......那么你不需要CTE:

SELECT 
    Subject, 
    MAX(Grade) Grade, 
    SUM(CASE WHEN Grade >= 50 THEN 1 ELSE 0 END) AS Pass, 
    SUM(CASE WHEN Grade < 50 THEN 1 ELSE 0 END) AS Fail 
FROM 
    Grade_report 
GROUP BY Subject 

您可以验证此:

http://sqlfiddle.com/#!3/99cd4/7

+0

非常感谢! – kevin 2012-08-05 05:21:47

+0

@kevin如果你看执行计划,你会发现它们是相同的。你刚刚做的就是所谓的[过早优化](http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize) - 基本上,你在非问题上浪费了时间,甚至可以说为此牺牲了一些可读性。 – Lucero 2012-08-05 11:31:26

相关问题