【发布时间】: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