【问题标题】:How to run cumulative totals by date with multiple groupings如何通过多个分组按日期运行累积总计
【发布时间】:2022-01-28 04:45:31
【问题描述】:

对于不同的投资组合和策略,我拥有数年的每日利润。对于每个日期、投资组合和策略,我希望查看每日利润(未计算,因为这已经可用),以及 MTD、QTD、YTD 和 LTD 值。我已经用一些嵌套的 while 循环完成了这一点,但需要很长时间,而且我相当有信心这可以通过一些连接来完成。如果有人能引导我完成它,将不胜感激。下面是练习的简化版本。前 4 列已经可用,正确的是我想要完成的:

Date GROUP_1 GROUP_2 Daily Profits MTD QTD YTD LTD
2021-01-15 A X 1 1 1 1 1
2021-01-19 A X 5 6 6 6 6
2021-01-20 A X 2 8 8 8 8
2021-01-24 A X 5 13 13 13 13
2021-02-19 A X 5 5 18 18 18
2021-02-23 A Y 4 4 4 4 4
2021-03-21 A X 1 1 19 19 19
2021-03-25 A Y 5 5 9 9 9
2021-04-20 A X 5 5 5 24 24
2021-04-24 A Y 2 2 2 11 11
2021-05-20 A X 3 3 8 27 27
2021-05-24 A Y 4 4 6 15 15
2021-01-15 B Y 5 5 5 5 5
2021-01-19 B Y 3 8 8 8 8
2021-01-20 B Y 1 9 9 9 9
2021-01-24 B Y 2 11 11 11 11
2021-02-19 B Y 4 4 15 15 15
2021-02-23 B Y 5 9 20 20 20
2021-03-21 B Y 1 1 21 21 21
2021-03-25 B Y 1 2 22 22 22
2021-04-20 B Y 4 4 4 26 26
2021-04-24 B Y 5 9 9 31 31
2021-05-20 B Y 1 1 10 32 32
2021-05-24 B Y 2 3 12 34 34

【问题讨论】:

  • sum(daily_profits) over(partition by group_1, group_2, year(date), datepart(quarter, date) order by date) as QTD
  • 谢谢,试试看!
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • @lptr 最好添加ROWS UNBOUNDED PRECEDING 否则如果有重复的日期可能会得到不正确的结果。它也更快
  • @Charlieface,我不熟悉。你介意展示一下它是如何使用的吗?

标签: sql sql-server tsql sql-server-2017


【解决方案1】:

类似下面的 SQL 脚本应该可以解决问题:

select 
  value_date,
  group_1,
  group_2,
  daily_profits,
  sum(daily_profits) over (partition by datepart(yy, value_date), datepart(mm, value_date), group_1, group_2 order by value_date, group_1, group_2 rows unbounded preceding) as MTD,
  sum(daily_profits) over (partition by datepart(yy, value_date), datepart(qq, value_date), group_1, group_2 order by value_date, group_1, group_2 rows unbounded preceding) as QTD,
  sum(daily_profits) over (partition by datepart(yy, value_date), group_1, group_2 order by value_date, group_1, group_2 rows unbounded preceding) as YTD,
  sum(daily_profits) over (partition by group_1, group_2 order by value_date, group_1, group_2 rows unbounded preceding) as LTD
from agg_profit
order by value_date, group_1, group_2

SQL Fiddle 供参考:http://sqlfiddle.com/#!18/d6c5f/1

可在此处找到文档:https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017

【讨论】:

  • 工作就像一个绝对的魅力,非常感谢!
  • @team_f_user 请务必接受答案。
  • @JohnCappelletti,完成
  • EOMONTH 可能比DATEPART(mm 更容易,另一方面,因为你有多个SUM OVERs,你可以通过第二次使用DATEPART 来避免额外的排序
猜你喜欢
  • 2014-04-12
  • 2019-04-24
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多