在UNION ALL上使用GROUP BY时未对结果进行分组

时间:2017-11-13 21:22:55

标签: mysql sql

我有两个表:AmbulancesRespondersResponder表格有一个call_sign列,Ambulances表格有4列 - call_sign_1, call_sign_2, call_sign_3, call_sign_4

我想编写一个查询来列出每个call_sign以及它在数据库中出现的次数(即每个响应者已经参加了多少次呼叫 - 包括救护车中的呼叫)。我创建的查询不止一次显示一些call_sign。

我希望将它们分组,以便每个call_sign只显示一次。

SELECT * FROM (
select call_sign as call_sign, count(call_sign) as `call_sign_count` from responders group by call_sign
UNION ALL
select call_sign_1 as call_sign, count(call_sign_1) as `call_sign_count` from ambulances group by call_sign
UNION ALL
select call_sign_2 as call_sign, count(call_sign_2) as `call_sign_count` from ambulances group by call_sign
UNION ALL
select call_sign_3 as call_sign, count(call_sign_3) as `call_sign_count` from ambulances group by call_sign
UNION ALL
select call_sign_4 as call_sign, count(call_sign_4) as `call_sign_count` from ambulances group by call_sign
) 
a WHERE call_sign IS NOT NULL Group By call_sign, call_sign_count

数据库和查询可以在这个小提琴中找到:

https://www.db-fiddle.com/f/9grxeiA277KtUqsiUbYMA8/0

1 个答案:

答案 0 :(得分:2)

是的,它会多次显示相同的call_sign,因为在外部查询中,您可以在call_sign call_sign_count上进行分组。如果您希望每个call_sign只出现一次,那么您只能对该字段进行分组并使用call_sign_count上的聚合函数,让我们说sum()。

SELECT call_sign, sum(call_sign_count) total_call_sign_count FROM (
select call_sign as call_sign, count(call_sign) as `call_sign_count` from responders group by call_sign
UNION ALL
select call_sign_1 as call_sign, count(call_sign_1) as `call_sign_count` from ambulances group by call_sign
UNION ALL
select call_sign_2 as call_sign, count(call_sign_2) as `call_sign_count` from ambulances group by call_sign
UNION ALL
select call_sign_3 as call_sign, count(call_sign_3) as `call_sign_count` from ambulances group by call_sign
UNION ALL
select call_sign_4 as call_sign, count(call_sign_4) as `call_sign_count` from ambulances group by call_sign
) 
a WHERE call_sign IS NOT NULL Group By call_sign