【问题标题】:Running total in SQL based on date基于日期在 SQL 中运行总计
【发布时间】:2021-12-14 01:45:19
【问题描述】:

所以我有以下两列,我想在 SQL 中按日期创建一个运行总计列 - 这是一个小的 sn-p

creation date is_registered
2021-03-30 1
2021-03-30 1
2021-03-31 1
2021-03-31 1

我似乎遇到的问题是日期有时间戳,而 reg 列是位格式,所以我尝试了以下查询

with reg as(      
    select
        cast([created_at] as date) as 'date',
        sum(cast([is_registered] as int)) as 'sum_of_reg'
    FROM [dbo].[Registrations]
    group by [created_at]
)
select
    [date],
    sum_of_reg,
    sum(sum_of_reg) over (order by [date]) as 'running total'
FROM reg
group by [date], sum_of_entries
order by [date] asc

但是这会返回以下内容:

date sum of reg running total
2021-03-30 1 1
2021-03-30 1 1
2021-03-31 2 3

我想回来

date sum of reg running total
2021-03-30 2 1
2021-03-31 2 3

而不是将日期组合成一个不同的值,它仍然显示相同的日期两次。

我认为由于时间戳,它仍然单独处理日期,但不确定解决方法

任何建议将不胜感激!

【问题讨论】:

  • 仅供参考,堆栈溢出支持代码块。也不要使用单引号 (') 作为别名。单引号用于文字字符串,而不是分隔标识对象名称。一些为别名使用单引号的方法已被弃用,仅在您定义它们时才有效,在其他地方无效; ORDER BY 'Quantity'按别名为 'Quantity' 的列排序。坚持使用不需要分隔标识的对象和别名,如果您必须分隔标识它们,请使用 T-SQL 标识符、方括号 ([]) 或 ANSI-SQL 的双引号 ( ").
  • 如果您将示例数据添加为 DDL+DML,那么人们可以更轻松地提供帮助。
  • 你需要在每个日期先聚合,然后你可以做你的“运行聚合”。
  • 您的初始数据似乎不是原始样本数据,而是部分处理后的数据。我们需要一些实际的样本数据,以及您想要的结果。
  • 如果您使用group by cast([created_at] as date),那么它将按日期分组。您也可以通过group by year([created_at]), month([created_at]) 对一年中的每个月进行汇总。

标签: sql sql-server tsql cumulative-sum


【解决方案1】:

你在reg CTE 中有错误的分组子句,你需要cast([created_at] as date)

外层group by不是必须的

不幸的是,OVER 子句中的默认窗口(当有 ORDER BY 时)是 RANGE UNBOUNDED PRECEDING,这很少是人们所期望的。
您必须明确指定 ROWS UNBOUNDED PRECEDING。强>

with reg as(      
    select
        cast([created_at] as date) as [date],
        sum(cast([is_registered] as int)) as [sum_of_reg]
    FROM [dbo].[Registrations]
    group by cast([created_at] as date)
)
select
    [date],
    sum_of_reg,
    sum(sum_of_reg) over (order by [date] ROWS UNBOUNDED PRECEDING) as [running total]
FROM reg
order by [date] asc

Y9ou 甚至可以在一个关卡中做到这一点

select
    cast([created_at] as date) as [date],
    sum(cast([is_registered] as int)) as [sum_of_reg],
    sum(sum(cast([is_registered] as int)))
      over (order by [date] ROWS UNBOUNDED PRECEDING) as [running total]
FROM [dbo].[Registrations]
group by cast([created_at] as date)
order by [date] asc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多