SQL-如何简化这个简单的查询?
我正在使用SQLServer2005 我如何重构这个查询SQL-如何简化这个简单的查询?,sql,sql-server,sql-server-2005,refactoring,Sql,Sql Server,Sql Server 2005,Refactoring,我正在使用SQLServer2005 我如何重构这个查询 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
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
您的两个子选择相同。忽略“服务”一词,尝试以下内容
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
您的两个子选择相同。忽略“服务”一词,尝试以下内容
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
看起来总数和服务计数是一样的,所以您需要解决这一问题,但下面是以更简单的方式进行计数的基本方法:
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]
看起来总数和服务计数是一样的,所以您需要解决这一问题,但下面是以更简单的方式进行计数的基本方法:
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]
我怀疑Totals子查询不应该包括
WHERE job\u class\u 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
我怀疑Totals子查询不应该包括
WHERE job\u class\u 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
这是对的吗?为什么总数只包括job_class_obj='S'的值?第一个内部选择('total')和第二个('service')之间的假定差异是什么?正如我在下面的评论中提到的,您不应该使用单引号来分隔别名-这种语法已被弃用。使用[方括号]、“双引号”或不使用分隔符。这是否正确?为什么总数只包括job_class_obj='S'的值?第一个内部选择('total')和第二个('service')之间的假定差异是什么?正如我在下面的评论中提到的,您不应该使用单引号来分隔别名-这种语法已被弃用。使用[方括号]、“双引号”或不使用分隔符。我认为您的意思是
SUM
notCOUNT
-COUNT
在本例中,每个列将返回相同的值,因为COUNT
只计算行,而不是实际值。此外,您不应该使用单引号来分隔别名-此语法已被弃用。使用[方括号]、“双引号”或不使用分隔符。SUM
在某些情况下可能返回NULL
,这可能是一个问题。出于这个原因,最好使用COUNT
。单引号确实不受欢迎。我应该更新我的答案。SUM
如果没有匹配的行,则返回NULL
<代码>计数返回正确答案;它仅在其参数为非NULL时计数。旁注:我更喜欢在表达式中使用1
,但任何非空参数都可以。对不起,你说得对,我不知道为什么在这种情况下我总是远离COUNT
,或者我今晚会有什么样的大脑放屁,但我怀疑是时候离开电脑了。我想你的意思是SUM
不是COUNT
-COUNT
在这种情况下,每个列都会返回相同的值,因为COUNT
只计算行,而不是实际值。此外,您不应该使用单引号来分隔别名-此语法已被弃用。使用[方括号]、“双引号”或不使用分隔符。SUM
在某些情况下可能返回NULL
,这可能是一个问题。出于这个原因,最好使用COUNT
。单引号确实不受欢迎。我应该更新我的答案。SUM
如果没有匹配的行,则返回NULL
<代码>计数返回正确答案;它仅在其参数为非NULL时计数。旁注:我更喜欢在表达式中使用1
,但任何非空参数都可以。对不起,你说得对,我不知道为什么在这些情况下我总是远离计数,或者我今晚会有什么样的大脑放屁,但我怀疑是时候离开电脑了。你的答案是唯一包含“分组依据”的答案,但是我更喜欢使用“计数”。你的答案是唯一包含“分组依据”的答案,而我更喜欢使用“计数”“伯爵”