如何在同一张表上计算不同结果的计数[重复]

Posted

技术标签:

【中文标题】如何在同一张表上计算不同结果的计数[重复]【英文标题】:How to get count for different results on same table [duplicate] 【发布时间】:2019-06-03 07:08:30 【问题描述】:

我有一组查询代表来自不同系统日期(过去 5、7 和 30 天)的数据。

我的疑问是如何在查询中表达这导致了这个问题:

STATE | 5 DAYS | 7 DAYS | 30 DAYS
---------------------------------
INIT  |   1    |   1    |    2
---------------------------------
SECN  |   2    |   2    |    2

注意:这是来自考虑不同系统日期的单个表

注意2:查询示例如下

select 
CASE WHEN STATUS = 'INI' then 'Initial' 
WHEN STATUS = 'SECN' the 'Second'
END 'Status', count(*)
from db.FilesTable
where 1=1
and DAT_Files >= DATEADD(day,-5,GETDATE())

【问题讨论】:

您能否向我们展示您的查询的简化版本? 我不明白你想在这里问什么。样本数据和预期结果将在这里真正有所帮助。您尝试自己解决什么问题(发布您的 SQL 尝试)。我怀疑这是一个条件聚合问题(类似于COUNT(CASE WHEN Column <= 5 THEN 1 END) AS Count5)。 我已经用基本查询编辑了问题 【参考方案1】:

我认为您可以编写这种类型的查询:

SELECT State,
       SUM (CASE WHEN ColA < 6 THEN 1 ELSE 0 END) AS '5 Days',
       SUM (CASE WHEN ColA IN (6, 7) THEN 1 ELSE 0 END) AS '7 Days',
       SUM (CASE WHEN ColA > 7 AND ColA < 31 THEN 1 ELSE 0 END) AS '30 Days'
FROM TableA

显然你可能想要调整一些东西,但这给出了一些方向。

【讨论】:

没有看到 OP 的数据,你怎么能确定这个查询甚至可以在这里工作? @TimBiegeleisen 绝对不确定,只是试一试。我们会从这里看到它把我们带到哪里。 我已经用基本查询编辑了问题【参考方案2】:

仅当特定条件发生时才使用条件聚合对记录进行计数。 CASE 将在聚合发生之前计算,因此您可以将任何表达式放在任何列上。

select
    State = T.Status,
    [5 Days] = COUNT(CASE WHEN T.DAT_Files >= DATEADD(day, -5, GETDATE()) THEN 1 END),
    [7 Days] = COUNT(CASE WHEN T.DAT_Files >= DATEADD(day, -7, GETDATE()) THEN 1 END),
    [30 Days] = COUNT(1)
from 
    db.FilesTable AS T
where
    T.Status IN ('INI', 'SECN') AND
    DAT_Files >= DATEADD(day, -30, GETDATE()) -- Biggest period filter here
GROUP BY
    T.Status

【讨论】:

它工作。谢谢

以上是关于如何在同一张表上计算不同结果的计数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一张表上没有左连接的情况下获得 D1 D7 D30

如何在 Oracle SQL 中查找和过滤同一张表上的数据

用where子句在同一张表上计算多个条件

无法在同一张表上查询和更新的问题解决方法

如何在 sql server 2008 的同一张表中使用计数和分组方式和自连接?

如何找出同一张表中特定状态的多个计数