从表上的不同条件中选择COUNT
|
我有一个名为\'jobs \'的表。对于特定用户,作业可以处于活动状态,已归档,过期,挂起或关闭。现在,每个页面请求都会生成5个COUNT查询,为了进行优化,我尝试将其减少为单个查询。到目前为止,这是我所拥有的,但是它几乎比5个单独的查询要快。请注意,我已经简化了每个子查询的条件,以使其更易于理解,但是完整查询的行为相同。
有没有一种方法可以在同一查询中获得这5个计数而不使用效率不高的子查询?
SELECT
(SELECT count(*)
FROM \"jobs\"
WHERE
jobs.creator_id = 5 AND
jobs.status_id NOT IN (8,3,11) /* 8,3,11 being \'inactive\' related statuses */
) AS active_count,
(SELECT count(*)
FROM \"jobs\"
WHERE
jobs.creator_id = 5 AND
jobs.due_date < \'2011-06-14\' AND
jobs.status_id NOT IN(8,11,5,3) /* Grabs the overdue active jobs
(\'5\' means completed successfully) */
) AS overdue_count,
(SELECT count(*)
FROM \"jobs\"
WHERE
jobs.creator_id = 5 AND
jobs.due_date BETWEEN \'2011-06-14\' AND \'2011-06-15 06:00:00.000000\'
) AS due_today_count
继续进行另外2个子查询,但我想您明白了。
是否有一种更简单的方法来收集此数据,因为作业表中的同一数据子集基本上有5个不同的COUNT个?
数据子集为\'creator_id = 5 \',之后每个计数基本上只是1-2个附加条件。请注意,目前我们正在使用Postgres,但可能会在不久的将来转向MySQL。因此,如果您可以提供与ANSI兼容的解决方案,我将不胜感激:)
没有找到相关结果
已邀请:
3 个回复
浆错
更新 如前所述,当0记录作为t返回时,此结果将作为所有值中Null的单个结果。您有三种选择 1)添加一个Haveing子句,以便您没有返回记录,而不是所有NULLS的结果
2)如果您希望返回所有零,则可以将所有总和加在一起 例如
3)利用sbarro证明的
这一事实。您应该注意,非空值可以是任何非1的值 例如
厘恼轨
敦肌
表达式。
函数也可与Azure SQL数据库一起使用(但目前不适用于Azure SQL数据仓库或并行数据仓库)。它是
表达式的简写。 当只有一种情况时,我发现自己使用的是
函数而不是
表达式。这样可以减轻写
而改成instead15ѭ的痛苦。如果可能满足多个条件(多个ѭ16s),则应考虑使用正则
表达式而不是嵌套的
函数。 返回两个值之一,具体取决于布尔表达式是否 在SQL Server中计算为true或false。 句法
争论
有效的布尔表达式。 如果此参数不是布尔表达式,则语法错误为 上调。
如果
计算得出的值,则返回 真正。
如果
计算得出的值 虚假。 备注
是编写a9ѭ表达式的简便方法。它评估 作为第一个参数传递的布尔表达式,然后返回 其他两个参数之一基于 评价。也就是说,如果布尔值返回ѭ21 表达式为true,如果布尔值返回ѭ23 表达式错误或未知。
和
可以是 任何类型。适用于
表达式的相同规则 布尔表达式,空值处理和返回类型也适用于
。有关更多信息,请参见ѭ9(Transact-SQL)。 将“ 8”翻译成“ 9”的事实也对 此功能的行为的其他方面。自
表达式最多只能嵌套10个
语句 也可以嵌套,最多嵌套10个级别。此外,
是 以语义上等效的方式“ 9”远程传输到其他服务器 表达式,以及远程ѭ9表达式的所有行为。 码 SQL中的“ 8”函数的实现类似于以下内容(使用@rsbarro在其答案中给出的相同逻辑):