【问题标题】: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)。
  • 我已经用基本查询编辑了问题

标签: sql-server


【解决方案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

【讨论】:

  • 它工作。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2018-03-11
  • 2018-08-12
  • 2013-05-20
相关资源
最近更新 更多