多个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说得很对。如果需要其他列,连接肯定是必要的。如果不需要,删除连接可能是一种优化。