Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server分组依据-将空值或空值聚合到所有其他值中_Sql Server_Group By_Null - Fatal编程技术网

Sql server SQL Server分组依据-将空值或空值聚合到所有其他值中

Sql server SQL Server分组依据-将空值或空值聚合到所有其他值中,sql-server,group-by,null,Sql Server,Group By,Null,我正试着按一列来分组。问题是列的NULL值被分组为一个单独的组 我希望将空值添加到其他组值中 表格示例: 我希望通过“val”列上的总和聚合从group by获得的结果: 有人能帮我吗 谢谢 您可以预先计算要分布在各行中的值,然后只需进行算术运算: select t.id, sum(t.val) + (null_sum / cnt_id) from t cross join (select count(distinct id) as cnt_id,

我正试着按一列来分组。问题是列的NULL值被分组为一个单独的组

我希望将空值添加到其他组值中

表格示例:

我希望通过“val”列上的总和聚合从group by获得的结果:

有人能帮我吗


谢谢

您可以预先计算要分布在各行中的值,然后只需进行算术运算:

select t.id,
       sum(t.val) + (null_sum / cnt_id)
from t cross join
     (select count(distinct id) as cnt_id,
             sum(case when id is null then val else 0 end) as null_sum
      from t
     ) tt
group by t.id;

注意:有些数据库进行整数除法,因此您可能需要
null\u sum*1.0/cnt\u id

您可以预先计算值,以便在各行中展开,然后只需执行算术:

select t.id,
       sum(t.val) + (null_sum / cnt_id)
from t cross join
     (select count(distinct id) as cnt_id,
             sum(case when id is null then val else 0 end) as null_sum
      from t
     ) tt
group by t.id;

注意:有些数据库进行整数除法,因此您可能需要
null\u sum*1.0/cnt\u id
A
GROUP BY
操作无法实时为每个组生成值,因此从逻辑上讲,您需要缺少的记录才能真正存在。 一种方法是使用日历表为每个
id
组生成包含一条
NULL
记录的表:

WITH ids AS (
    SELECT DISTINCT id FROM yourTable
    WHERE id IS NOT NULL
),
cte AS (
    SELECT t1.id, t2.val
    FROM ids t1
    CROSS JOIN yourTable t2
    WHERE t2.id IS NULL
)

SELECT t.id, SUM(t.val) AS val
FROM
(
    SELECT id, val FROM yourTable WHERE id IS NOT NULL
    UNION ALL
    SELECT id, val FROM cte
) t
GROUP BY
    id;

A
GROUP BY
操作无法实时为每个组生成值,因此从逻辑上讲,您需要丢失的记录才能真正存在。 一种方法是使用日历表为每个
id
组生成包含一条
NULL
记录的表:

WITH ids AS (
    SELECT DISTINCT id FROM yourTable
    WHERE id IS NOT NULL
),
cte AS (
    SELECT t1.id, t2.val
    FROM ids t1
    CROSS JOIN yourTable t2
    WHERE t2.id IS NULL
)

SELECT t.id, SUM(t.val) AS val
FROM
(
    SELECT id, val FROM yourTable WHERE id IS NOT NULL
    UNION ALL
    SELECT id, val FROM cte
) t
GROUP BY
    id;

谢谢!我的问题是我在分组集中有多个列。。。我尝试了你的解决方案,做了一些调整,但它太重了…它一点也不重。您需要以某种方式生成缺少的行,这是一种简单的方法。谢谢!我的问题是我在分组集中有多个列。。。我尝试了你的解决方案,做了一些调整,但它太重了…它一点也不重。您需要以某种方式生成缺少的行,这是一种简单的方法。