如何在 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/
我有临时 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/