当前位置: 代码迷 >> Sql Server >> sql根据条件将数据累加并储存到临时表
  详细解决方案

sql根据条件将数据累加并储存到临时表

热度:2   发布时间:2016-04-24 09:25:10.0
sql根据条件将数据累加并存储到临时表
有一个表
a                      b                                   c                      d                   e
2201         20150101001                0001              11                 10
2201         20150101001                0001              11                 35
2201         20150101001                0001              11                 45
2202         20150101001                0002              11                 17
2202        20150101001                 0002              11                 56
2202        20150101001                 0002              11                 23
所得到的表
a                      b                                   c                      d                   e            f
2201         20150101001                0001              11                 10          10
2201         20150101001                0001              11                 35          45
2201         20150101001                0001              11                 45          90
2202         20150101001                0002              11                 17         17
2202        20150101001                 0002              11                 56          73
2202        20150101001                 0002              11                 23         96
f列的数据为当a   b c d一致时,当前行的f=当前行的e加上一行的f

------解决思路----------------------
;WITH CTE AS(
SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN
,*
FROM TB
)
SELECT T1.a,T1.b,T1.c,T1.d,T1.e,SUM(T2.e)f
FROM CTE T1
JOIN CTE T2 ON T1.RN>=T2.RN
GROUP BY T1.a,T1.b,T1.c,T1.d,T1.e,T1.RN
你这个累计是要求有顺序的,你却没有给这个顺序的列名
------解决思路----------------------
;WITH CTE AS(
SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN
,*
FROM TB
)
SELECT T1.a,T1.b,T1.c,T1.d,T1.e,SUM(T2.e)f
INTO #临时表
FROM CTE T1
JOIN CTE T2 ON T1.RN>=T2.RN
AND T1.a = T2.a AND T1.b = T2.b
AND T1.c = T2.c AND T1.d = T2.d
GROUP BY T1.a,T1.b,T1.c,T1.d,T1.e,T1.RN

------解决思路----------------------
我说的顺序,是指,a b c d都相同的同组间的顺序方式,没有额外的列用来指定顺序吗

以下这个可以直接查询,不用插入到临时表
;WITH CTE AS(
    SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN
        ,*
    FROM TB
)
SELECT T1.a,T1.b,T1.c,T1.d,T1.e,SUM(T2.e)f
FROM CTE T1
    JOIN CTE T2 ON T1.RN>=T2.RN
GROUP BY T1.a,T1.b,T1.c,T1.d,T1.e,T1.RN

------解决思路----------------------
貌似可以直接这样
SELECT T1.a,T1.b,T1.c,T1.d,SUM(T2.d)E
FROM TB T1
    JOIN TB T2 ON T1.a=T2.a AND T1.b=T2.b AND T1.c>=T2.c
GROUP BY T1.a,T1.b,T1.c,T1.d
  相关解决方案