从连续行总结

时间:2012-06-02 06:11:01

标签: tsql

假设我们有一个表,并且我们想要对Expend列进行总和,这样求和只会将相同Week_Name的值相加。

SN  Week_Name  Exp  Sum
--  ---------  ---  ---
1   Week 1     10   0
2   Week 1     20   0
3   Week 1     30   60
4   Week 2     40   0
5   Week 2     50   90
6   Week 3     10   0

我假设我们需要'Order By'Week_Name,然后将之前的Week_Name(上一行)与当前行Week_name(当前行)进行比较。
如果两者相同,则在SUM列中输入零。

如果不相同,请添加所有支出,其中Week_Name = Week_Name(上一行)并放在Sum列中。最终输出应该如上表所示。

非常感谢任何有关如何在T-SQL中实现此功能的帮助。

2 个答案:

答案 0 :(得分:0)

我不确定为什么你的SN = 6线是0而不是10.你真的不想要上周的总和吗?如果上周总计没问题,那么你可能会想要这样的东西:

;WITH CTE AS (
  SELECT Week_Name,SUM([Expend.]) as SumExpend
  ,MAX(SN) AS MaxSN
  FROM T
  GROUP BY Week_Name
  )
SELECT T.*,CASE WHEN T.SN = CTE.MaxSN THEN SumExpend
           ELSE 0 END AS [Sum]
FROM T
JOIN CTE on CTE.Week_Name = T.Week_Name

根据需要在SUM中运行总计的注释中的请求,您可以尝试这样做:

;WITH CTE AS (
SELECT Week_Name, MAX(SN) AS MaxSN
FROM T
GROUP BY Week_Name
)
SELECT T.SN, T.Week_Name,T.Exp, 
CASE WHEN T.SN = CTE.MaxSN THEN
(SELECT SUM(EXP) FROM T T2 
 WHERE T2.SN <= T.SN) ELSE 0 END AS [SUM]
FROM T
JOIN CTE ON CTE.Week_Name = T.Week_Name
ORDER BY SN

答案 1 :(得分:0)

好的,我最终能够解决这个问题,赞美耶稣!如果你想要我上面给出的确切表,你可以使用下面的GilM响应,它是完美的。如果你希望你的表有运行累积,即第3行应该有60,第5行应该有150,第6行160等。然后,你可以使用我的代码:

USE CAPdb 
IF OBJECT_ID ('dbo.[tablebp]') IS NOT NULL
DROP TABLE [tablebp] 

GO
CREATE TABLE [tablebp] (
    tablebpcCol1 int PRIMARY KEY
  ,tabledatekey datetime
  ,tableweekname varchar(50)
  ,expenditure1 numeric
  ,expenditure_Cummulative numeric
)   

INSERT INTO [tablebp](tablebpcCol1,tabledatekey,tableweekname,expenditure1,expenditure_Cummulative)
SELECT b.s_tablekey,d.PK_Date,d.Week_Name,
SUM(b.s_expenditure1) AS s_expenditure1,
SUM(b.s_expenditure1) + COALESCE((SELECT SUM(s_expenditure1)
    FROM source_table bs JOIN dbo.Time dd ON bs.[DATE Key] = dd.[PK_Date]
    WHERE dd.PK_Date < d.PK_Date),0)
FROM source_table b
INNER JOIN dbo.Time d ON b.[Date key] = d.PK_Date 
GROUP BY d.[PK_Date],d.Week_Name,b.s_tablekey,b.s_expenditure1
ORDER BY d.[PK_Date]

;WITH CTE AS ( 
   SELECT tableweekname
   ,Max(expenditure_Cummulative) AS Week_expenditure_Cummulative
   ,MAX(tablebpcCol1) AS MaxSN 
FROM [tablebp] 
GROUP BY tableweekname 
) 
SELECT [tablebp].*
,CASE WHEN [tablebp].tablebpcCol1 = CTE.MaxSN THEN Week_expenditure_Cummulative
       ELSE 0 END AS [RunWeeklySum]
FROM [tablebp]
JOIN CTE on CTE.tableweekname = [tablebp].tableweekname