Sql server T-SQL不会忽略总和中的空值
我试图将运行总计添加到表中,在空值上,运行总计应为空。但是,SUM忽略空值 有没有办法不忽略总和中的NULLSql server T-SQL不会忽略总和中的空值,sql-server,tsql,sum,cumulative-sum,Sql Server,Tsql,Sum,Cumulative Sum,我试图将运行总计添加到表中,在空值上,运行总计应为空。但是,SUM忽略空值 有没有办法不忽略总和中的NULL SELECT run_key, time_empty, SUM(time_empty) OVER (PARTITION BY col1, col2 ORDER BY run_key ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as time_empty_rt FROM tblmytable ORD
SELECT
run_key,
time_empty,
SUM(time_empty) OVER (PARTITION BY col1, col2 ORDER BY run_key ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as time_empty_rt
FROM
tblmytable
ORDER BY
run_key
除了两个步骤之外,我看不到其他方法,首先确定要汇总的岛屿,然后进行汇总。因此,首先是岛屿:
DECLARE @T TABLE (run_key INT, time_empty INT, Col1 INT, Col2 INT)
INSERT @T (run_key, time_empty)
VALUES
(1, 637), (2, NULL), (3, NULL), (4, NULL),
(5, 2967), (6, 1000), (7, NULL), (8, NULL);
SELECT run_key,
time_empty,
IslandID = ROW_NUMBER() OVER(ORDER BY Run_key) -
ROW_NUMBER()
OVER(PARTITION BY
Col1,
Col2,
CASE WHEN time_empty IS NULL THEN 1 ELSE 0 END
ORDER BY Run_key)
FROM @T
ORDER BY run_key;
其中:
run_key time_empty IslandID
------------------------------
1 637 0
2 NULL 1
3 NULL 1
4 NULL 1
5 2967 3
6 1000 3
7 NULL 3
8 NULL 3
现在,这将为您提供一列(IslandID
)进行分区,该列将在下一个非空值时正确重置总和:
DECLARE @T TABLE (run_key INT, time_empty INT, Col1 INT, Col2 INT)
INSERT @T (run_key, time_empty)
VALUES
(1, 637), (2, NULL), (3, NULL), (4, NULL),
(5, 2967), (6, 1000), (7, NULL), (8, NULL);
SELECT run_key,
time_empty,
time_empty_rt = CASE WHEN time_empty IS NULL THEN NULL
ELSE SUM(time_empty)
OVER (PARTITION BY Col1, Col2, IslandID
ORDER BY run_key
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
END
FROM ( SELECT run_key,
time_empty,
Col1,
Col2,
IslandID = ROW_NUMBER() OVER(ORDER BY Run_key)
- ROW_NUMBER()
OVER(PARTITION BY
Col1,
Col2,
CASE WHEN time_empty IS NULL THEN 1 ELSE 0 END
ORDER BY Run_key)
FROM @T
) AS t;
您可以为前面的
null
列数相同的每个组创建一个分区
select run_key
, time_empty
, sum(time_empty) over (
partition by preceding_nulls
order by run_key
rows between unbounded preceding and current row) as time_emtpy_rt
from (
select sum(case when time_empty is null then 1 else 0 end) over (
order by run_key
rows between unbounded preceding and current row) as preceding_nulls
, *
from YourTable yt
) sub
提供您选择的样本数据并检查我的答案。这应该有效。它确实依赖于
run_key
严格按照1的步骤递增。你是对的,不知道我为什么这么做。。。。我将run_key-ROW_NUMBER()…
替换为ROW_NUMBER()(按run_key排序)-ROW_NUMBER()…
,即正确的间隙和孤岛处理方法,这消除了在第1步中增加的要求。谢谢你的提醒。