Sql server SQL Server分组依据-将空值或空值聚合到所有其他值中
我正试着按一列来分组。问题是列的NULL值被分组为一个单独的组 我希望将空值添加到其他组值中 表格示例: 我希望通过“val”列上的总和聚合从group by获得的结果: 有人能帮我吗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,
谢谢 您可以预先计算要分布在各行中的值,然后只需进行算术运算:
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
AGROUP 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;
谢谢!我的问题是我在分组集中有多个列。。。我尝试了你的解决方案,做了一些调整,但它太重了…它一点也不重。您需要以某种方式生成缺少的行,这是一种简单的方法。谢谢!我的问题是我在分组集中有多个列。。。我尝试了你的解决方案,做了一些调整,但它太重了…它一点也不重。您需要以某种方式生成缺少的行,这是一种简单的方法。