带有 group by 子句的多个聚合函数

5

我有以下内容

WorkflowID  FK_UA                DateApprobation
----------- -------------------- -----------------------
1           3                    NULL
2           1                    NULL
3           1                    NULL
4           2                    2013-05-31 09:22:33.000

我希望做的是获取一堆聚合字段。
我想要获取已批准工作流、未批准工作流和所有工作流。
我知道的方法是检查“DateApprobation”字段是否为空或有值。
问题是,我想能够按“FK_UA”进行分组,因此我不知道如何使用带有group by子句的3个聚合函数(COUNT)。
我正在寻找一个可以实现这一点的查询,我尝试了几个类似的案例,但返回了一些奇怪的值。
我尝试过这个:
SELECT
    FK_UA
,COUNT(WorkflowID) AS TOTAL
,COUNT(CASE when DateApprobation is not null then 1 else 0 end) AS APPROVED
,COUNT(CASE when DateApprobation is null then 1 else 0 end) AS NOT_APPROVED   
FROM Workflow        
GROUP BY
FK_UA

但它总是针对所有3个值返回相同的结果!
2个回答

3
SELECT
    SUM(CASE WHEN [DateApprobation] IS NOT NULL THEN 1 ELSE 0 END) as [Approbated count],
    SUM(CASE WHEN [DateApprobation] IS NULL THEN 1 ELSE 0 END) as [Non-Approbated count],
    COUNT(*) as [Total]
FROM YourTable
GROUP BY FK_UA 

如果我理解得正确的话....

1
非常感谢。我真的脑子一抽,把COUNT和SUM搞混了。 - user2440674

1

使用COUNT()的标准SQL解决方案

你也可以使用COUNT(),但是请确保将你不想计数的值转换为NULL,而不是0,因为在SQL中聚合函数不会聚合NULL

SELECT
  fk_ua,
  COUNT(WorkflowID) AS total,
  COUNT(CASE WHEN DateApprobation IS NOT NULL THEN 1 END) AS approved,
  COUNT(CASE WHEN DateApprobation IS NULL THEN 1 END) AS not_approved
FROM Workflow        
GROUP BY fk_ua

事实上,在您的情况下,您可以进一步采取这一步骤,因为您已经在计算“NOT NULL”值:
SELECT
  fk_ua,
  COUNT(WorkflowID) AS total,
  COUNT(DateApprobation) AS approved,
  COUNT(WorkflowID) - COUNT(DateApprobation) AS not_approved
FROM Workflow        
GROUP BY fk_ua

或者,另一种选择是:
SELECT fk_ua, total, approved, total - approved AS not_approved
FROM (
  SELECT
    fk_ua,
    COUNT(WorkflowID) AS total,
    COUNT(DateApprobation) AS approved
  FROM Workflow
  GROUP BY fk_ua
) t

针对大型数据集,这种方法可能会稍微快一些,因为您的数据库应该能够识别只有两个不同的COUNT(...)表达式。大多数商业数据库都可以做到。
使用FILTER进行标准SQL解决方案
一些SQL方言,包括例如PostgreSQL,在实现标准的FILTER子句时,您可以使用它来使事情更加易读。您的查询将如下所示:
SELECT
  fk_ua,
  COUNT(*) AS total,
  COUNT(*) FILTER (WHERE DateApprobation IS NOT NULL) AS approved,
  COUNT(*) FILTER (WHERE DateApprobation IS NULL) AS not_approved
FROM Workflow        
GROUP BY fk_ua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接