Sql server T-SQL不会忽略总和中的空值

Sql 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

我试图将运行总计添加到表中,在空值上,运行总计应为空。但是,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
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步中增加的要求。谢谢你的提醒。