我们假设我有下表
| a_id | b_id | price |
| 1 | 10 | 100 |
| 1 | 11 | 50 |
| 1 | NULL | 300 |
我希望通过a_id和b_id对它进行分组并得到价格的总和,但是NULL必须属于这两个组。我想得到这样的表
| a_id | price |
| 1 | 400 |
| 1 | 350 |
有什么想法吗?提前谢谢。
答案 0 :(得分:3)
您可以将数据拆分为两个不同的子集然后添加。
因此,集合A仅包含B_ID不为空的记录。 集合B仅包含B_ID为空的记录
这带来的风险是,如果a_ID可能有多个NULL B_ID,则连接将导致多对多,并且总和将是错误的。如果B_ID仅为1 A_ID为空,那么这是有效的。
SELECT A.a_ID, A.B_ID, sum(A.Price+coalesce(B.Price,0)) price
FROM tab3 A
LEFT JOIN tab3 B
on A.A_ID = B.A_ID
and B.B_ID is null
WHERE A.B_ID is not null
GROUP BY A.A_ID, A.B_ID
使用lad2025的rextester demo
进行测试如果然而,我们有一个A_ID的多个NULL B_ID,那么我们需要在子查询中的连接之前加总。例如在http://rextester.com/PNV55958
中SELECT A.a_ID, A.B_ID, sum(A.Price+coalesce(B.Price,0)) price
FROM tab3 A
LEFT JOIN (SELECT SUM(Price) Price, A_ID
FROM tab3
WHERE B_ID is null
GROUP BY A_ID) B
on A.A_ID = B.A_ID
WHERE A.B_ID is not null
GROUP BY A.A_ID, A.B_ID
答案 1 :(得分:2)
您可以使用:
SELECT a_id,
SUM(price) + COALESCE(
(SELECT SUM(price) FROM tab3 WHERE a_id = t.a_id AND b_id IS NULL),0)
AS price
FROM tab3 t
WHERE b_id IS NOT NULL
GROUP BY a_id, b_id;
<强> Rextester Demo 强>
工作原理:
答案 2 :(得分:1)
你可以这样做
select a_id, nonnullsums.sum1 + coalesce(nullbidsums.sum2, 0) from
(select a_id, sum(price) as sum1
from mytable
where b_id is not null
group by a_id, b_id) as nonnullsums
left join
(select a_id, sum(price) as sum2
from mytable
where b_id is null
group by a_id) as nullbidsums
on nonnullsums.a_id = nullbidsums.a_id
这将两个总和分开,然后聚合它们。你可以通过为每个a_id做一个子查询来添加空值的总和,但效率会降低。