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

发布于 2025-01-05 01:22:56 字数 650 浏览 3 评论 0原文

我正在使用 SQL Server 2005。

我如何重构这个查询?

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

I am using 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

追风人 2025-01-12 01:22:56

看起来总数和服务计数正在计算相同的内容,因此您需要解决这个问题,但基本上以下是如何以更简单的方式进行计数:

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]

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]
樱花坊 2025-01-12 01:22:56

您的两个子选择是相同的。忽略“服务”一项,尝试以下方法

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

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
清风疏影 2025-01-12 01:22:56

我怀疑 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

I suspect that the Totals subquery should not include the WHERE job_class_ojb = 'S' condition - if so, I suggest:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文