Tsql 从连续行求和

Tsql 从连续行求和,tsql,Tsql,假设我们有一个表,我们想对expense列进行求和,这样求和只会将同一个Week_名称的值相加 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 USE CAPdb IF OBJEC

假设我们有一个表,我们想对expense列进行求和,这样求和只会将同一个Week_名称的值相加

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
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
我假设我们需要“按周下单”,然后将前一周下单前一行与当前行下单周下单当前行进行比较。 如果两者相同,则在SUM列中输入零

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
如果不相同,则添加所有支出,其中Week_Name=Week_Name上一行,并将其放入Sum列。最终输出应如上表所示

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

非常感谢您在T-SQL中提供的任何帮助。

我不知道为什么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
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
根据注释中的要求,您可以尝试以下方法:

;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
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

好吧,我终于解决了这个问题,赞美耶稣!如果你想要我上面给出的确切表格,你可以使用下面吉尔姆的回答,它是完美的。如果您希望您的表具有运行累积数,即第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

什么版本的SQL Server。。。还是Sybase?两者都使用TSQL。。。你尝试过什么?你不想用reqular SQL查询来实现这一点吗?当然,GiLM工作得很好,上一篇专栏文章你是对的。有上周的总数是可以的。然而,我对原来的表有一点修改。如何使总和列累积。因此,在上面的示例中,第三行是60,第五行是150,最后一行是160,所有这些都在SUM列上。