Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-如何简化这个简单的查询?_Sql_Sql Server_Sql Server 2005_Refactoring - Fatal编程技术网

SQL-如何简化这个简单的查询?

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

我正在使用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
         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
not
COUNT
-
COUNT
在本例中,每个列将返回相同的值,因为
COUNT
只计算行,而不是实际值。此外,您不应该使用单引号来分隔别名-此语法已被弃用。使用[方括号]、“双引号”或不使用分隔符。
SUM
在某些情况下可能返回
NULL
,这可能是一个问题。出于这个原因,最好使用
COUNT
。单引号确实不受欢迎。我应该更新我的答案。
SUM
如果没有匹配的行,则返回
NULL
<代码>计数返回正确答案;它仅在其参数为非NULL时计数。旁注:我更喜欢在表达式中使用
1
,但任何非空参数都可以。对不起,你说得对,我不知道为什么在这种情况下我总是远离
COUNT
,或者我今晚会有什么样的大脑放屁,但我怀疑是时候离开电脑了。我想你的意思是
SUM
不是
COUNT
-
COUNT
在这种情况下,每个列都会返回相同的值,因为
COUNT
只计算行,而不是实际值。此外,您不应该使用单引号来分隔别名-此语法已被弃用。使用[方括号]、“双引号”或不使用分隔符。
SUM
在某些情况下可能返回
NULL
,这可能是一个问题。出于这个原因,最好使用
COUNT
。单引号确实不受欢迎。我应该更新我的答案。
SUM
如果没有匹配的行,则返回
NULL
<代码>计数返回正确答案;它仅在其参数为非NULL时计数。旁注:我更喜欢在表达式中使用
1
,但任何非空参数都可以。对不起,你说得对,我不知道为什么在这些情况下我总是远离计数,或者我今晚会有什么样的大脑放屁,但我怀疑是时候离开电脑了。你的答案是唯一包含“分组依据”的答案,但是我更喜欢使用“计数”。你的答案是唯一包含“分组依据”的答案,而我更喜欢使用“计数”“伯爵”