【问题标题】:Combined cumulative for each row and each column in sql server? [closed]sql server中每一行和每一列的组合累积? [关闭]
【发布时间】:2013-05-11 20:13:52
【问题描述】:

我想在我的表中添加一列,例如计算合并累积:

a    b    c    d        newcoulmn
50   0    0    0            50        
0    7    0    0            57
0    0    6    0            63
0    0    0   (4)           59
0    3    0    0            62
0    2    0    0            64
0    0    0   (8)           56
0    0    0   (7)           49

【问题讨论】:

  • 让我们看看你的尝试......
  • @MitchWheat - 问的好方法你试过什么? :)

标签: sql-server sql-server-2008 sql-server-2005 crystal-reports crystal-reports-2008


【解决方案1】:

你需要选择a + b + c - d的总和,然后使用窗口函数ROW_NUMBER()计算这个值的累加和:

WITH CTE
AS
(
  SELECT *, a + b + c - d AS abcd,
     ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rn
  FROM test
)
SELECT c1.a, c1.b, c1.c, c1.d, 
  COALESCE((SELECT SUM(c2.abcd)
            FROM cte AS c2
            WHERE c1.rn >= c2.rn), c1.abcd) AS newcolumn
FROM CTE AS c1;

在这里查看它的实际效果:

这会给你:

|  A | B | C | D | NEWCOLUMN |
------------------------------
| 50 | 0 | 0 | 0 |        50 |
|  0 | 7 | 0 | 0 |        57 |
|  0 | 0 | 6 | 0 |        63 |
|  0 | 0 | 0 | 4 |        59 |
|  0 | 3 | 0 | 0 |        62 |
|  0 | 2 | 0 | 0 |        64 |
|  0 | 0 | 0 | 8 |        56 |
|  0 | 0 | 0 | 7 |        49 |

更新:

根据您的查询,可以这样写:

WITH YourOriginalQuery
AS
(
    select plitno, A, datils, 0 AS B, 0 AS C, 0 AS D from table1 
    union all 
    select critno, 0, 0, B, 0, 0 from table2 
    union all 
    select klitno, 0, 0, 0, C, 0 from table3 
    union all 
    select bgitno, 0, 0, 0, 0, D from table4
), WITH CTE
AS
(
  SELECT *, a + b + c - d AS abcd,
     ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rn
  FROM YourOriginalQuery
)
SELECT c1.a, c1.b, c1.c, c1.d, 
  COALESCE((SELECT SUM(c2.abcd)
            FROM cte AS c2
            WHERE c1.rn >= c2.rn), c1.abcd) AS newcolumn
FROM CTE AS c1;

【讨论】:

  • 谢谢,但我想在查询中使用此语句:select plitno,A,datils,0,0,0 from table1 union all select critno,0,0,B,0,0 from table2 union all select klitno,0,0,0,C,0 from table3 union all select bgitno,0,0,0,0,D from table4
  • @belalsaeed,请查看我的更新答案。
  • 当我在更新后使用 SQL 语句时显示消息 102,级别 15,状态 1,第 17 行 ')' 附近的语法不正确。但是,当我在更新之前使用此声明时,请不要向我显示任何问题,请帮助我并感谢
  • @belalsaeed - 你想用这个语句来UPDATE 一些字段吗?如果是这样,您可以将CTEUPDATE 一起使用,直接更新它,例如WITH CTE AS ( ... ) UPDATE CTE SET ...。但是你没有在你的问题中说任何关于更新的事情!请更新您的问题并向我展示您想做什么,以及您尝试的UPDATE 查询,这将非常有助于了解您要做什么。谢谢。
猜你喜欢
  • 2014-01-03
  • 2018-06-28
  • 2023-03-07
  • 2019-06-04
  • 2022-01-24
  • 2013-07-13
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
相关资源
最近更新 更多