如何在 SQL 中显示所有已批准状态的总数?

Posted

技术标签:

【中文标题】如何在 SQL 中显示所有已批准状态的总数?【英文标题】:how to show total count of all approved status in SQL? 【发布时间】:2020-11-05 17:37:00 【问题描述】:

我有这个数据,每个系统都有很多行。它还包括类型、状态和日期。 状态为完成、未完成、进行中、尚未开始。 我需要根据系统和日期计算这些行属于“B”类型的系统有多少,并且状态是 ALL APPROVED。

我试过了:

select system, date, count(line) from project_system
where type = 'B'
group by system, date 
having min(status) = max(status) and min(status) = 'APPROVED'

通过上面的脚本,我仍然没有得到想要的结果。结果给我的系统状态已经全部批准,但总行数。它显示如下:

system   date       count
1       19-20-12      4
2       19-20-12      12
3       19-20-12      6
1       19-21-12      3
2       19-21-12      1

我希望看到类似的东西:

 date       count
19-20-12      3
19-21-12      2

我应该如何更改我的查询?

谢谢。

【问题讨论】:

欢迎来到 SO。请看:Why should I provide an MCRE for what seems to me to be a very simple SQL query? 因为你有GROUP BY system, date,你会为每个system得到一个单独的结果。 【参考方案1】:

GROUP BY system, date 表示每对系统和日期都有单独的一行。

将其用作子查询,然后在主查询中按日期分组以按日期获取计数。

SELECT date, COUNT(*) AS fount
FROM (
    select system, date
    from project_system
    where type = 'B'
    group by system, date 
    having min(status) = max(status) and min(status) = 'APPROVED'
) AS x
GROUP BY date

无需在子查询中获取计数。

【讨论】:

【参考方案2】:

你可以用一个聚合查询做你想做的事:

select date,
       ( count(distinct system) -
        count(case when status <> 'APPROVED' then system end)
       ) as num_approved_only
from project_system
where type = 'B'
group by date ;

这个想法是计算不同的系统,然后从该计数中减去状态不是'APPROVED' 的系统的数量。

【讨论】:

以上是关于如何在 SQL 中显示所有已批准状态的总数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5 中登录时检查用户状态?

想要在 laravel (blade) 中显示登录用户的特定投诉总数

如何在 oracle-sql 中计算周一待处理票的总数?

如何按文件状态显示最后一行的总数?

保存后如何显示所选选项

如何在没有联系人批准的情况下自动批准 Ejabberd 服务器中的在线状态请求