2012-02-14 85 views
1

我正在使用SQL Server 2005.SQL - 如何简化这个简单的查询?

我该如何重构此查询?

SELECT Total, Installs, Service, tot.ls_chg_dte_ojb 
    FROM (SELECT COUNT(*) [Total], ls_chg_dte_ojb 
     FROM [COMPL_INST_SVC] 
     GROUP BY ls_chg_dte_ojb) tot 

    JOIN (SELECT COUNT(*) [Service], ls_chg_dte_ojb 
     FROM [COMPL_INST_SVC] 
     WHERE job_class_ojb = 'S' 
     GROUP BY ls_chg_dte_ojb) svc on svc.ls_chg_dte_ojb = tot.ls_chg_dte_ojb 

    JOIN (SELECT COUNT(*) [Installs], ls_chg_dte_ojb 
     FROM [COMPL_INST_SVC] 
     WHERE job_class_ojb in ('C', 'R') 
     GROUP BY ls_chg_dte_ojb) ins on ins.ls_chg_dte_ojb = tot.ls_chg_dte_ojb 
+0

是,即使正确吗?为什么总数只包含job_class_obj ='S'的值? – 2012-02-14 00:17:05

+1

第一个内部选择('总')和第二个('服务')之间的区别是什么? – deutschZuid 2012-02-14 00:17:30

+1

正如我在下面的评论中所提到的,您不应该使用单引号来分隔别名 - 此语法已被弃用。使用[方括号],“双引号”或不使用分隔符。 – 2012-02-14 01:46:54

回答

2

的线条看起来像道达尔和服务计数的东西都指望同样的事情,所以你需要解决这个问题,但这里基本上是你怎么做计数在一个简单的方法:

SELECT 
    COUNT(CASE WHEN job_class_ojb = 'S' THEN 1 END) AS [Total], 
    COUNT(CASE WHEN job_class_ojb = 'S' THEN 1 END) AS [Service], 
    COUNT(CASE WHEN job_class_ojb in ('C', 'R') THEN 1 END) AS [Installs] 
FROM 
    [COMPL_INST_SVC] 
+1

我认为你的意思是'SUM'而不是'COUNT' - 在这种情况下'COUNT'将在每一列中返回相同的值,因为'COUNT'只是对行进行计数,而不是实际值。此外,您不应使用单引号分隔别名 - 此语法已被弃用。使用[方括号],“双引号”或不使用分隔符。 – 2012-02-14 01:46:37

+1

在某些情况下,SUM可以返回NULL,这可能是一个问题。出于这个原因,最好使用“COUNT”。 – 2012-02-14 01:51:49

+0

单引号确实被弃用。我应该更新我的答案。 – 2012-02-14 01:52:18

2

你的两个子选择是相同的。忽略了“服务”,请尝试沿着

SELECT 
SUM(CASE WHEN job_class_ojb = 'S' THEN 1 ELSE 0 END) as Total, 
SUM(CASE WHEN job_class_ojb = 'C' or 
       job_class_ojb = 'R' THEN 1 ELSE 0 END) as Installs 
FROM COMPL_INST_SVC 
1

我怀疑总计子查询不应包括WHERE job_class_ojb = 'S'条件 - 如果是的话,我建议:

SELECT COUNT(*) Total, 
     SUM(CASE WHEN job_class_ojb = 'S' THEN 1 ELSE 0 END) Service, 
     SUM(CASE WHEN job_class_ojb in ('C','R') THEN 1 ELSE 0 END) Installs, 
     ls_chg_dte_ojb 
FROM COMPL_INST_SVC 
GROUP BY ls_chg_dte_ojb 
+0

你的答案是唯一一个包括'GROUP BY'但我更喜欢使用'COUNT' – CodingIsAwesome 2012-02-15 07:24:46