简体   繁体   English

SQL-如何简化此简单查询?

[英]SQL - How do I simplify this easy query?

I am using SQL Server 2005. 我正在使用SQL Server 2005。

How could I refactor this query? 如何重构该查询?

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

Two of your sub-selects are the same. 您的两个子选择相同。 Ignoring the 'Service' one, try something along the lines of 忽略“服务”之一,尝试以下方法

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

It looks like the Total and Service counts are counting the same exact thing, so you'll need to fix that, but here's basically how you do the counts in a simpler way: 看起来“总数”和“服务”计数都在计数相同的确切事物,因此您需要解决此问题,但是基本上这是您以更简单的方式进行计数的方法:

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]

I suspect that the Totals subquery should not include the WHERE job_class_ojb = 'S' condition - if so, I suggest: 我怀疑Totals子查询不应包含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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM