按月分组的运行计数以汇总销售额
Posted
技术标签:
【中文标题】按月分组的运行计数以汇总销售额【英文标题】:Running count grouped by month to aggregate sales 【发布时间】:2017-09-11 12:37:52 【问题描述】:我有一个带有字段 Datatime(DateTime
) 和 sales(Number
) 的销售表。
如何编写一个 SQL 查询来获取过去 6 个月按月份分组的数据,其中包含一个新列“运行计数”。
运行计数是一个正整数,从 1 开始(如果销售额为 0),然后如果下个月有销售则为 2(假设有销售并且上个月的运行计数为 1)等等。如果一个月没有销售,则该月的计数将为 0,如果下个月有销售,则以 1 重新开始,依此类推。
示例: 当前月份年份是“09/2017”,3 月、4 月、6 月、7 月、8 月有销售,但 5 月份没有销售(无行)。 所以输出将是:
| Month_Year | Sum(Sales) | Running_Count |
| 03/2017 | 1000 | 1 |
| 04/2017 | 1500 | 2 |
| 05/2017 | 0 | 0 |
| 06/2017 | 300 | 1 |
| 07/2017 | 550 | 2 |
| 08/2017 | 1900 | 3 |
欢迎提出修改此问题的建议。
【问题讨论】:
你的问题是什么? 也许这个问题对你有帮助***.com/questions/8345282/sql-server-group-by-month 附注:FLOAT???当您有可用的精确类型(即 NUMBER)时,为什么要使用近似数据类型? NUMBER 中的 38 位可能数字不足以满足您庞大的销售数字吗?我建议你改变这个。非绝对必要时不要使用 FLOAT。 @ThorstenKettner 谢谢,我已经更新了。 @kenfire 我知道如何按月分组。我的问题是如何实现运行计数部分。 【参考方案1】:这很丑……但它有效:
WITH
aset
AS
(SELECT month_year
, sales
, CASE WHEN COALESCE (LAG (sales) OVER (ORDER BY month_year), 0) = 0 THEN 1 ELSE 0 END COUNT
FROM deleteme_table),
bset
AS
(SELECT month_year, sales, SUM (COUNT) OVER (ORDER BY month_year) count_group
FROM aset)
SELECT month_year
, sales
, CASE
WHEN sales = 0
THEN
0
ELSE
ROW_NUMBER ()
OVER (
PARTITION BY count_group ORDER BY month_year
)
END
running_count
FROM bset;
SALES MONTH_YEAR RUNNING_COUNT
1000 2017/03/01 1
1500 2017/04/01 2
0 2017/05/01 0
300 2017/06/01 1
550 2017/07/01 2
1900 2017/08/01 3
【讨论】:
以上是关于按月分组的运行计数以汇总销售额的主要内容,如果未能解决你的问题,请参考以下文章
MySql Group 并按月汇总每个部门全年的销售额,加入多个表