Sql server SQL Server-如何在特定条件下运行累积差异
我有这样的数据:Sql server SQL Server-如何在特定条件下运行累积差异,sql-server,Sql Server,我有这样的数据: Ranking | Quota | Amount --------------------------- 9503 | 2000 | 0 9408 | 1800 | 1800 9407 | 1800 | 1800 9406 | 1800 | 0 9405 | 1500 | 0 9404 | 1100 | 2000 1403 | 1000 | 0 Ranking | Quota | Amount | Cu
Ranking | Quota | Amount
---------------------------
9503 | 2000 | 0
9408 | 1800 | 1800
9407 | 1800 | 1800
9406 | 1800 | 0
9405 | 1500 | 0
9404 | 1100 | 2000
1403 | 1000 | 0
Ranking | Quota | Amount | Cum_Diff
------------------------------------
9503 | 2000 | 0 | 2000
9408 | 1800 | 1800 | 1800
9407 | 1800 | 1800 | 1300
9406 | 1800 | 0 | 0
9405 | 1500 | 0 | 0
9404 | 1100 | 2000 | 0
1403 | 1000 | 0 | 0
我还有一个变量包含来自另一个查询的先前金额,假设这个变量名为@previous_amount,值为500。我必须计算SUM(Amount)-@Previous_Amount,然后计算运行差异,但必须检查列配额
在本例中,SUM(Amount)-@Previous_Amount=5600-500=5100,因此我的预期结果如下:
Ranking | Quota | Amount
---------------------------
9503 | 2000 | 0
9408 | 1800 | 1800
9407 | 1800 | 1800
9406 | 1800 | 0
9405 | 1500 | 0
9404 | 1100 | 2000
1403 | 1000 | 0
Ranking | Quota | Amount | Cum_Diff
------------------------------------
9503 | 2000 | 0 | 2000
9408 | 1800 | 1800 | 1800
9407 | 1800 | 1800 | 1300
9406 | 1800 | 0 | 0
9405 | 1500 | 0 | 0
9404 | 1100 | 2000 | 0
1403 | 1000 | 0 | 0
我必须根据配额分成5100份
有人知道怎么做吗?您可以使用之间的
行来获得累计的总和
,然后我们可以使用案例
来显示适当的值:
CREATE TABLE dbo.TestTable (Ranking int,
Quota int,
Amount int);
INSERT INTO dbo.TestTable (Ranking,
Quota,
Amount)
VALUES(9503,2000,0),
(9408,1800,1800),
(9407,1800,1800),
(9406,1800,0),
(9405,1500,0),
(9404,1100,2000),
(1403,1000,0);
GO
DECLARE @Previous_Amount int = 5100;
WITH CTE AS(
SELECT TT.Ranking,
TT.Quota,
TT.Amount,
@Previous_Amount - SUM(TT.Quota) OVER (ORDER BY TT.Ranking DESc
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Cumulative
FROM dbo.TestTable TT)
SELECT C.Ranking,
C.Quota,
C.Amount,
CASE WHEN C.Cumulative > 0 THEN C.Quota
WHEN C.Quota + C.Cumulative > 0 THEN C.Quota + C.Cumulative
ELSE 0
END AS Cum_Diff
FROM CTE C
ORDER BY C.Ranking DESC;
GO
DROP TABLE dbo.TestTable;
(假设您使用的是受支持的SQL Server版本,但我建议这是一个安全的假设,因为您没有提到您使用的是不受支持的版本。)您可以使用之间的行来获得累计总和,然后我们可以使用大小写来显示适当的值:
CREATE TABLE dbo.TestTable (Ranking int,
Quota int,
Amount int);
INSERT INTO dbo.TestTable (Ranking,
Quota,
Amount)
VALUES(9503,2000,0),
(9408,1800,1800),
(9407,1800,1800),
(9406,1800,0),
(9405,1500,0),
(9404,1100,2000),
(1403,1000,0);
GO
DECLARE @Previous_Amount int = 5100;
WITH CTE AS(
SELECT TT.Ranking,
TT.Quota,
TT.Amount,
@Previous_Amount - SUM(TT.Quota) OVER (ORDER BY TT.Ranking DESc
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Cumulative
FROM dbo.TestTable TT)
SELECT C.Ranking,
C.Quota,
C.Amount,
CASE WHEN C.Cumulative > 0 THEN C.Quota
WHEN C.Quota + C.Cumulative > 0 THEN C.Quota + C.Cumulative
ELSE 0
END AS Cum_Diff
FROM CTE C
ORDER BY C.Ranking DESC;
GO
DROP TABLE dbo.TestTable;
(假设您使用的是受支持的SQL Server版本,但我建议这是一个安全的假设,因为您没有提到您使用的是不受支持的版本。)您可以将之间的行用于总和(金额)
和总和(配额)
以及大小写表达式。我使用了CTE来实现更模块化的方法
DECLARE @Previous_Amount INT =500
;WITH CTE AS
(
SELECT SUM(AMOUNT) OVER (ORDER BY Ranking DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
- @Previous_Amount - ISNULL(SUM(QUOTA) OVER (ORDER BY Ranking DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ),0) AS ComputedDifferenc, *
FROM @TABLE1
)
SELECT Ranking,Quota,Amount,CASE WHEN ComputedDifferenc > Quota THEN Quota ELSE CASE WHEN ComputedDifferenc >0 THEN ComputedDifferenc ELSE 0 END END AS Cum_Diff
FROM CTE
您可以将
之间的行用于总和(金额)
和总和(配额)
以及大小写表达式。我使用了CTE来实现更模块化的方法
DECLARE @Previous_Amount INT =500
;WITH CTE AS
(
SELECT SUM(AMOUNT) OVER (ORDER BY Ranking DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
- @Previous_Amount - ISNULL(SUM(QUOTA) OVER (ORDER BY Ranking DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ),0) AS ComputedDifferenc, *
FROM @TABLE1
)
SELECT Ranking,Quota,Amount,CASE WHEN ComputedDifferenc > Quota THEN Quota ELSE CASE WHEN ComputedDifferenc >0 THEN ComputedDifferenc ELSE 0 END END AS Cum_Diff
FROM CTE
示例数据已按排名说明排序。。排名是一个基于类型和序列号的自定义列,每种类型都有不同的优先级。不知道我是怎么错过的。显然,咖啡还没有开始。示例数据已经按排名顺序说明。。排名是一个基于类型和序列号的自定义列,每种类型都有不同的优先级。不知道我是怎么错过的。咖啡显然没有起作用,它起作用了。。非常感谢你的帮助。。我猜你已经有咖啡了?哈哈哈:)我已经在第二条@Carolline了;很明显,咖啡因并没有起作用。如果这回答了问题,请将其标记为解决方案;未来的读者会知道这是有帮助的。谢谢它起作用了。。非常感谢你的帮助。。我猜你已经有咖啡了?哈哈哈:)我已经在第二条@Carolline了;很明显,咖啡因并没有起作用。如果这回答了问题,请将其标记为解决方案;未来的读者会知道这是有帮助的。谢谢