多个SQL使用多个条件计数

多个SQL使用多个条件计数,sql,sql-server,select,count,Sql,Sql Server,Select,Count,我一直在尝试优化从数据库中检索数据以显示在软件开发的“仪表板”类型页面上的方式 我的数据库结构如下: 需求表,包含所有不同字段的各种需求,但重要的是一个REQ_ID作为键 包含的Tasks表可以包含多个TASK,这些TASK具有TASK_ID、TASK_名称(开发、测试或发布)、TASK_状态(未启动、完成、阻止)、TASK_窗口(任务完成时的Week1、Week2等)以及指向REQ_I需求的链接。例如,一个需求可能有多个DEV任务,只有当与需求相关的所有开发人员任务都已完成时,测试任务和发布

我一直在尝试优化从数据库中检索数据以显示在软件开发的“仪表板”类型页面上的方式

我的数据库结构如下:

  • 需求表,包含所有不同字段的各种需求,但重要的是一个REQ_ID作为键
  • 包含的Tasks表可以包含多个TASK,这些TASK具有TASK_ID、TASK_名称(开发、测试或发布)、TASK_状态(未启动、完成、阻止)、TASK_窗口(任务完成时的Week1、Week2等)以及指向REQ_I需求的链接。例如,一个需求可能有多个DEV任务,只有当与需求相关的所有开发人员任务都已完成时,测试任务和发布任务(但对于)才能是开发人员完成的,否则是不完整的

我想查询这两个表,为我提供一个结果集,该结果集在单个查询中分别包含每个DEV任务窗口的DEV Complete、Test Complete和Release Complete需求数。我目前正在执行多个查询,每个查询都包含子查询,然后使用PHP聚合结果,但是执行总共需要15秒,是否有人可以帮助我将其整合到单个查询中>

我意识到这是一个老问题,但我使用以下模式进行了测试:

SELECT r.REQ_ID, 
       SUM(CASE WHEN t.TASK_NAME = 'DEV' THEN 1 ELSE 0 END) AS DevComplete,
       SUM(CASE WHEN t.TASK_NAME = 'TEST' THEN 1 ELSE 0 END) AS TestComplete,
       SUM(CASE WHEN t.TASK_NAME = 'RELEASE' THEN 1 ELSE 0 END) AS ReleaseComplete
    FROM Requirements r
        INNER JOIN Tasks t
            ON r.REQ_ID = t.REQ_ID
    WHERE t.TASK_STATUS = 'Complete'
    GROUP BY r.REQ_ID
模式1:

SELECT
 [Count1] = SUM(CASE WHEN ... THEN 1 ELSE 0 END),
 [Count2] = SUM(CASE WHEN ... THEN 1 ELSE 0 END)
FROM
 [Table]
GROUP BY
 [Field]
SELECT
  [COUNT1] = (SELECT COUNT(*) FROM [Table] WHERE ...),
  [Count2] = (SELECT COUNT(*) FROM [Table] WHERE ...)
模式2:

SELECT
 [Count1] = SUM(CASE WHEN ... THEN 1 ELSE 0 END),
 [Count2] = SUM(CASE WHEN ... THEN 1 ELSE 0 END)
FROM
 [Table]
GROUP BY
 [Field]
SELECT
  [COUNT1] = (SELECT COUNT(*) FROM [Table] WHERE ...),
  [Count2] = (SELECT COUNT(*) FROM [Table] WHERE ...)

在我的例子中,当运行两个查询时,模式2占用了36%的时间,模式1占用了64%。对我来说,模式1看起来更优雅,但在我的场景中,它的性能几乎没有那么好。

+1-好的旧
SUM(CASE…
)。有什么它不能修复的吗?您应该能够消除连接,只需将t.REQ分组_ID@JNK:的确如此。本周末我在SQL Saturday 67上进行了一次会议,并说了“案例”是他在SQL中最喜欢的四个字母的单词。我必须同意他的说法。@gcooney:我想让查询开放,以允许可能需要需求表中的其他列。@Joe Stefanelli说得很对。如果需要其他列,连接肯定是必要的。如果不需要,删除连接可能是一种优化。