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份

  • 在第1行中,quota=2000,cum_diff=5100,因此它将返回max quota,即2000
  • 在第2行中,quota=1800,cum_diff=5100-2000=3100,因此它将返回max quota,即1800
  • 在第3行中,quota=1800,cum_diff=5100-2000-1800=1300,因此它将返回1300,因为1300小于quota
  • 另一行将返回0
  • 注意:排名列是根据特定条件生成的列,因此cum_diff将通过排名desc来填充订单


    有人知道怎么做吗?

    您可以使用之间的
    行来获得累计的
    总和
    ,然后我们可以使用
    案例
    来显示适当的值:

    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了;很明显,咖啡因并没有起作用。如果这回答了问题,请将其标记为解决方案;未来的读者会知道这是有帮助的。谢谢