如何在 SQL 服务器中执行 "customized" 运行 总数?

How do perform a "customized" running total in SQL Server?

我有临时 table,我总共填充了 运行。我使用了 SQL 服务器窗口函数。我的临时 table 中的数据采用以下格式:

|Day  | Sku  Nbr | CMQTY  | 
| 1   |  f45     |   0    |
| 2   |  f45     |   2    | 
| 3   |  f45     |   0    | 
| 4   |  f45     |   7    | 
| 5   |  f45     |   0    | 
| 6   |  f45     |   0    | 
| 7   |  f45     |   0    | 
| 8   |  f45     |   13   | 
| 9   |  f45     |  15    | 
| 10  |  f45     |  21    |

我想对数据进行操作,使其显示如下:

|Day| Sku Nbr | CMQTY | 
| 1 |  f45    | 0     | 
| 2 |  f45    | 2     | 
| 3 |  f45    | 2     | 
| 4 |  f45    | 7     | 
| 5   |  f45  |   7   | 
| 6   |  f45  |   7   | 
| 7   |  f45  |   7   | 
| 8   |  f45  |   13  | 
| 9   |  f45  |  15   | 
| 10  |  f45  |  21   |

我尝试过使用滞后函数,但是当我连续多天使用 0 CMQTY 时会出现问题。我也尝试过使用 CASE WHEN 逻辑但失败了。

您可以使用row_number如下

;with cte as (
select *, sm = sum(case when cmqty>0 then 1 else 0 end) over (order by [day]) from #yoursum
)
select *, sum(cmqty) over(partition by sm order by [day]) from cte

你的table结构

create table #yoursum ([day] int, sku_nbr varchar(10), CMQTY int)

insert into #yoursum 
([Day]  , Sku_Nbr , CMQTY  )  values 
 ( 1   ,'f45',   0  )
,( 2   ,'f45',   2  )
,( 3   ,'f45',   0  )
,( 4   ,'f45',   7  )
,( 5   ,'f45',   0  )
,( 6   ,'f45',   0  )
,( 7   ,'f45',   0  )
,( 8   ,'f45',   13 )
,( 9   ,'f45',  15  )
,( 10  ,'f45',  21  )

为了好玩,另一种方法。首先是一些示例数据:

IF OBJECT_ID('tempdb..#t1') IS NOT NULL DROP TABLE #t1;

CREATE TABLE #t1
(
  [day]     int        NOT NULL,
  [Sku Nbr] varchar(5) NOT NULL, 
  CMQTY     int        NOT NULL,
  CONSTRAINT pk_t1 PRIMARY KEY CLUSTERED([day] ASC)
);

INSERT #t1 VALUES
(1 , 'f45', 0),
(2 , 'f45', 2),
(3 , 'f45', 0),
(4 , 'f45', 7),
(5 , 'f45', 0),
(6 , 'f45', 0),
(7 , 'f45', 0),
(8 , 'f45', 13), 
(9 , 'f45', 15), 
(10, 'f45', 21);

以及解决方案:

DECLARE @RunningTotal int = 0;

UPDATE #t1
SET @RunningTotal = CMQTY = IIF(CMQTY = 0, @RunningTotal, CMQTY)
FROM #t1 WITH (TABLOCKX)
OPTION (MAXDOP 1);

结果:

day  Sku Nbr CMQTY
---- ------- ------
1    f45     0
2    f45     2
3    f45     2
4    f45     7
5    f45     7
6    f45     7
7    f45     7
8    f45     13
9    f45     15
10   f45     21

这种方法被称为本地可更新变量或Quirky Update。您可以在这里阅读更多相关信息:http://www.sqlservercentral.com/articles/T-SQL/68467/