group by null属于所有组

时间:2017-07-31 19:30:14

标签: mysql sql

我们假设我有下表

|     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     |

有什么想法吗?提前谢谢。

3 个答案:

答案 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

工作原理:

  • 主查询根据a_id进行聚合,b_id,其中b_id IS NOT NULL
  • 添加到b_id IS NULL(相关子查询)
  • 的结果值

答案 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做一个子查询来添加空值的总和,但效率会降低。