【问题标题】:How do I find the sum of rolling quarter revenues in SQL Server?如何在 SQL Server 中找到滚动季度收入的总和?
【发布时间】:2019-02-01 07:46:38
【问题描述】:

我在平面数据上进行了编码并获得了最好的结果。现在我想找到滚动四个季度收入的总和。

数据集:

Symbol Date Quarter Type Revenue
---------------------------------
A1 12/31/2018 4q2018 x1 5000
B1 12/31/2018 4q2018 x2 2000
C1 12/31/2018 4q2018 x3 3500
D1 12/31/2018 4q2018 x4 2000
A1 09/30/2018 3q2018 x1 1000
B1 09/30/2018 3q2018 x2 2000
C1 09/30/2018 3q2018 x3 1500
D1 09/30/2018 3q2018 x4 2500
A1 06/30/2018 2q2018 x1 1000
B1 06/24/2018 2q2018 x2 4000
C1 06/30/2018 2q2018 x3 1000
D1 06/30/2018 2q2018 x4 2000
A1 03/31/2018 1q2018 x1 1000
B1 01/28/2018 1q2018 x2 4000
C1 02/21/2018 1q2018 x3 1000
D1 03/31/2018 1q2018 x4 2500
A1 12/31/2017 4q2017 x1 1000
B1 12/31/2017 4q2017 x2 2000
C1 12/31/2017 4q2017 x3 1500
D1 12/31/2017 4q2017 x4 2500

预期输出:

5th row: A1 4q2018 x1 8000 (sum of previous 4 quarters)
6th row: A1 4q2018 x1 12000 (sum of previous 4 quarters)
7th row: A1 4q2018 x1 7500 (sum of previous 4 quarters)
8th row: A1 4q2018 x1 9000 (sum of previous 4 quarters)

4 条记录后还是一样

13th row: A1 3q2018 x1 4000 (sum of 3q, 2q, 1q 2018 and 4q 2017) 

【问题讨论】:

  • 您需要添加更多详细信息,例如具有预期输出的示例数据,并向我们展示您的尝试?
  • 嗨,这是非常糟糕的信息...请尝试添加带有示例数据和预期输出的minimal reproducible example。顺便说一句:v2008 快用完了,你可以read this
  • “滚动四分之二”是什么意思?
  • 添加了更多信息。
  • 我相信你的日期也是错误的。 2017 年第四季度应该是 2017 年 12 月 31 日。不是 2018 年

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

您将需要使用OVER 子句。大概是这样的

select Symbol, [Quarter], SUM(Revenue) OVER (PARTITION BY Symbol
                                     ORDER BY [Date]
                                     ROWS 4 PRECEDING) AS total

付钱,我想你会接近的。另请阅读此处的文档:https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017

【讨论】:

  • 您的查询有一点问题,请参阅我的回答,前面的行应该是 3 并且记录按日期排序
【解决方案2】:

Sean 对上述代码稍作改动,而他的代码添加了所有行,这解决了问题:

CREATE TABLE #t (Symbol varchar(5),Date datetime,Quarter varchar(10),Type varchar(2),Revenue int)
GO
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('A1','12/31/2018','4q2018','x1',5000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('B1','12/31/2018','4q2018','x2',2000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('C1','12/31/2018','4q2018','x3',3500)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('D1','12/31/2018','4q2018','x4',2000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('A1','09/30/2018','3q2018','x1',1000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('B1','09/30/2018','3q2018','x2',2000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('C1','09/30/2018','3q2018','x3',1500)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('D1','09/30/2018','3q2018','x4',2500)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('A1','06/30/2018','2q2018','x1',1000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('B1','06/24/2018','2q2018','x2',4000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('C1','06/30/2018','2q2018','x3',1000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('D1','06/30/2018','2q2018','x4',2000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('A1','03/31/2018','1q2018','x1',1000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('B1','01/28/2018','1q2018','x2',4000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('C1','02/21/2018','1q2018','x3',1000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('D1','03/31/2018','1q2018','x4',2500)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('A1','12/31/2017','4q2017','x1',1000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('B1','12/31/2017','4q2017','x2',2000)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('C1','12/31/2017','4q2017','x3',1500)
INSERT INTO #t (Symbol,Date,Quarter,Type,Revenue) VALUES('D1','12/31/2017','4q2017','x4',2500)

--SELECT * FROM #t WHERE Symbol = 'B1' ORDER BY Date Desc
select Symbol, [Quarter], SUM(Revenue) OVER (PARTITION BY Symbol
                                     ORDER BY [Date]
                                     ROWS 3 PRECEDING) AS total,Date
FROM #t
ORDER BY Date Desc

这是 sql server 2008 的另一个更新:

    select a.Symbol, a.[Quarter], x.Rev,a.Date
FROM #t a 
CROSS APPLY (   SELECT ISNULL(SUM(re), 0) Rev
                    FROM (  SELECT TOP(4) b.Revenue re
                            FROM #t b
                            WHERE b.Symbol = a.Symbol and Convert(varchar,b.Date,112) <= Convert(varchar,a.Date,112)
                            ORDER BY b.Date DESC ) v
                ) x
ORDER BY a.Date Desc

    DROP TABLE #t

【讨论】:

  • 所以你只是复制了我的答案?
  • 你可以这么说,我只是不想编辑你的,但无论如何我会写它类似于其他什么
  • SQL Server 2008 是否支持“preceding”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多