Reputation: 61
I have two tables: Ambulances
and Responders
. The Responder
table has one call_sign
column and the Ambulances
table has 4 columns - call_sign_1, call_sign_2, call_sign_3, call_sign_4
.
I want to write a query to list every call_sign and how many times it appears in the database (i.e. how many calls each responder has attended - including the ones in ambulances). The query I've created displays some call_sign's more than once.
I'd like them to be grouped so each call_sign only appears once.
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
The databse and query can be found in this fiddle:
https://www.db-fiddle.com/f/9grxeiA277KtUqsiUbYMA8/0
Upvotes: 1
Views: 79
Reputation: 34232
Yes, it displays the same call_sign
multiple times because in the outer query you group by on call_sign
and call_sign_count
. If you want each call_sign
to appear only once, then you can only group on that field and use an aggregate function on call_sign_count
, let's say 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
Upvotes: 2