SQL Exercise: Countries where assistant referees assist most matches
SQL soccer Database: Joins Exercise-47 with Solution
47. From the following table, write a SQL query to find the countries from where the assistant referees assist most of the matches. Return country name and number of matches.
Sample table: match_detailsmatch_no | play_stage | team_id | win_lose | decided_by | goal_score | penalty_score | ass_ref | player_gk ----------+------------+---------+----------+------------+------------+---------------+---------+----------- 1 | G | 1207 | W | N | 2 | | 80016 | 160140 1 | G | 1216 | L | N | 1 | | 80020 | 160348 2 | G | 1201 | L | N | 0 | | 80003 | 160001 2 | G | 1221 | W | N | 1 | | 80023 | 160463 3 | G | 1224 | W | N | 2 | | 80031 | 160532 3 | G | 1218 | L | N | 1 | | 80025 | 160392 4 | G | 1206 | D | N | 1 | | 80008 | 160117 4 | G | 1217 | D | N | 1 | | 80019 | 160369 5 | G | 1222 | L | N | 0 | | 80011 | 160486 5 | G | 1204 | W | N | 1 | | 80022 | 160071 6 | G | 1213 | W | N | 1 | | 80036 | 160279 6 | G | 1212 | L | N | 0 | | 80029 | 160256 7 | G | 1208 | W | N | 2 | | 80014 | 160163 7 | G | 1223 | L | N | 0 | | 80006 | 160508 8 | G | 1219 | W | N | 1 | | 80018 | 160416 8 | G | 1205 | L | N | 0 | | 80012 | 160093 9 | G | 1215 | D | N | 1 | | 80017 | 160324 9 | G | 1220 | D | N | 1 | | 80010 | 160439 10 | G | 1203 | L | N | 0 | | 80004 | 160047 10 | G | 1211 | W | N | 2 | | 80007 | 160231 11 | G | 1202 | L | N | 0 | | 80026 | 160024 11 | G | 1209 | W | N | 2 | | 80028 | 160187 12 | G | 1214 | D | N | 1 | | 80009 | 160302 12 | G | 1210 | D | N | 1 | | 80015 | 160208 13 | G | 1217 | L | N | 1 | | 80001 | 160369 13 | G | 1218 | W | N | 2 | | 80002 | 160392 14 | G | 1216 | D | N | 1 | | 80030 | 160348 14 | G | 1221 | D | N | 1 | | 80032 | 160463 15 | G | 1207 | W | N | 2 | | 80033 | 160140 15 | G | 1201 | L | N | 0 | | 80027 | 160001 16 | G | 1206 | W | N | 2 | | 80005 | 160117 16 | G | 1224 | L | N | 1 | | 80013 | 160531 17 | G | 1223 | L | N | 0 | | 80035 | 160508 17 | G | 1212 | W | N | 2 | | 80034 | 160256 18 | G | 1208 | D | N | 0 | | 80021 | 160163 18 | G | 1213 | D | N | 0 | | 80024 | 160278 19 | G | 1211 | W | N | 1 | | 80016 | 160231 19 | G | 1220 | L | N | 0 | | 80020 | 160439 20 | G | 1205 | D | N | 2 | | 80004 | 160093 20 | G | 1204 | D | N | 2 | | 80007 | 160071 21 | G | 1219 | W | N | 3 | | 80017 | 160416 21 | G | 1222 | L | N | 0 | | 80010 | 160486 22 | G | 1203 | W | N | 3 | | 80009 | 160047 22 | G | 1215 | L | N | 0 | | 80015 | 160324 23 | G | 1210 | D | N | 1 | | 80030 | 160208 23 | G | 1209 | D | N | 1 | | 80032 | 160187 24 | G | 1214 | D | N | 0 | | 80008 | 160302 24 | G | 1202 | D | N | 0 | | 80019 | 160024 25 | G | 1216 | L | N | 0 | | 80035 | 160348 25 | G | 1201 | W | N | 1 | | 80034 | 160001 26 | G | 1221 | D | N | 0 | | 80001 | 160463 26 | G | 1207 | D | N | 0 | | 80002 | 160140 27 | G | 1217 | L | N | 0 | | 80011 | 160369 27 | G | 1224 | W | N | 3 | | 80022 | 160531 28 | G | 1218 | D | N | 0 | | 80003 | 160392 28 | G | 1206 | D | N | 0 | | 80023 | 160117 29 | G | 1223 | L | N | 0 | | 80031 | 160508 29 | G | 1213 | W | N | 1 | | 80025 | 160278 30 | G | 1212 | L | N | 0 | | 80026 | 160256 30 | G | 1208 | W | N | 1 | | 80028 | 160163 31 | G | 1205 | L | N | 0 | | 80033 | 160093 31 | G | 1222 | W | N | 2 | | 80027 | 160486 32 | G | 1204 | W | N | 2 | | 80021 | 160071 32 | G | 1219 | L | N | 1 | | 80024 | 160416 33 | G | 1210 | W | N | 2 | | 80018 | 160208 33 | G | 1202 | L | N | 1 | | 80012 | 160024 34 | G | 1209 | D | N | 3 | | 80014 | 160187 34 | G | 1214 | D | N | 3 | | 80006 | 160302 35 | G | 1211 | L | N | 0 | | 80036 | 160233 35 | G | 1215 | W | N | 1 | | 80029 | 160324 36 | G | 1220 | L | N | 0 | | 80005 | 160439 36 | G | 1203 | W | N | 1 | | 80013 | 160047 37 | R | 1221 | L | P | 1 | 4 | 80004 | 160463 37 | R | 1213 | W | P | 1 | 5 | 80007 | 160278 38 | R | 1224 | W | N | 1 | | 80014 | 160531 38 | R | 1212 | L | N | 0 | | 80006 | 160256 39 | R | 1204 | L | N | 0 | | 80003 | 160071 39 | R | 1214 | W | N | 1 | | 80023 | 160302 40 | R | 1207 | W | N | 2 | | 80008 | 160140 40 | R | 1215 | L | N | 1 | | 80019 | 160324 41 | R | 1208 | W | N | 3 | | 80018 | 160163 41 | R | 1218 | L | N | 0 | | 80012 | 160392 42 | R | 1209 | L | N | 0 | | 80017 | 160187 42 | R | 1203 | W | N | 4 | | 80010 | 160047 43 | R | 1211 | W | N | 2 | | 80009 | 160231 43 | R | 1219 | L | N | 0 | | 80015 | 160416 44 | R | 1206 | L | N | 1 | | 80001 | 160117 44 | R | 1210 | W | N | 2 | | 80002 | 160208 45 | Q | 1213 | L | P | 1 | 3 | 80005 | 160278 45 | Q | 1214 | W | P | 1 | 5 | 80013 | 160302 46 | Q | 1224 | W | N | 3 | | 80001 | 160531 46 | Q | 1203 | L | N | 1 | | 80002 | 160047 47 | Q | 1208 | W | P | 1 | 6 | 80016 | 160163 47 | Q | 1211 | L | P | 1 | 5 | 80020 | 160231 48 | Q | 1207 | W | N | 5 | | 80021 | 160140 48 | Q | 1210 | L | N | 2 | | 80024 | 160208 49 | S | 1214 | W | N | 2 | | 80011 | 160302 49 | S | 1224 | L | N | 0 | | 80022 | 160531 50 | S | 1207 | W | N | 2 | | 80008 | 160140 50 | S | 1208 | L | N | 1 | | 80019 | 160163 51 | F | 1214 | W | N | 1 | | 80004 | 160302 51 | F | 1207 | L | N | 0 | | 80007 | 160140Sample table: asst_referee_mast
ass_ref_id | ass_ref_name | country_id ------------+--------------------------+------------ 80034 | Tomas Mokrusch | 1205 80038 | Martin Wilczek | 1205 80004 | Simon Beck | 1206 80006 | Stephen Child | 1206 80007 | Jake Collin | 1206 80014 | Mike Mullarkey | 1206 80026 | Frederic Cano | 1207 80028 | Nicolas Danos | 1207 80005 | Mark Borsch | 1208 80013 | Stefan Lupp | 1208 80016 | Gyorgy Ring | 1209 80020 | Vencel Toth | 1209 80033 | Damien McGraith | 1215 80008 | Elenito Di Liberatore | 1211 80019 | Mauro Tonolini | 1211 80021 | Sander van Roekel | 1226 80024 | Erwin Zeinstra | 1226 80025 | Frank Andas | 1229 80031 | Kim Haglund | 1229 80012 | Tomasz Listkiewicz | 1213 80018 | Pawel Sokolnicki | 1213 80029 | Sebastian Gheorghe | 1216 80036 | Octavian Sovre | 1216 80030 | Nikolay Golubev | 1217 80032 | Tikhon Kalugin | 1217 80037 | Anton Averyanov | 1217 80027 | Frank Connor | 1228 80010 | Dalibor Durdevic | 1227 80017 | Milovan Ristic | 1227 80035 | Roman Slysko | 1218 80001 | Jure Praprotnik | 1225 80002 | Robert Vukan | 1225 80003 | Roberto Alonso Fernandez | 1219 80023 | Juan Yuste Jimenez | 1219 80011 | Mathias Klasenius | 1220 80022 | Daniel Warnmark | 1220 80009 | Bahattin Duran | 1222 80015 | Tarik Ongun | 1222Sample table: soccer_country
country_id | country_abbr | country_name ------------+--------------+--------------------- 1201 | ALB | Albania 1202 | AUT | Austria 1203 | BEL | Belgium 1204 | CRO | Croatia 1205 | CZE | Czech Republic 1206 | ENG | England 1207 | FRA | France 1208 | GER | Germany 1209 | HUN | Hungary 1210 | ISL | Iceland 1211 | ITA | Italy 1212 | NIR | Northern Ireland 1213 | POL | Poland 1214 | POR | Portugal 1215 | IRL | Republic of Ireland 1216 | ROU | Romania 1217 | RUS | Russia 1218 | SVK | Slovakia 1219 | ESP | Spain 1220 | SWE | Sweden 1221 | SUI | Switzerland 1222 | TUR | Turkey 1223 | UKR | Ukraine 1224 | WAL | Wales 1225 | SLO | Slovenia 1226 | NED | Netherlands 1227 | SRB | Serbia 1228 | SCO | Scotland 1229 | NOR | Norway
Sample Solution:
SQL Code:
-- Selecting the country name and the count of distinct match numbers for each country where an assistant referee is involved
SELECT
country_name, -- Selecting the country name from the soccer_country table
count(DISTINCT match_no) -- Counting the distinct match numbers for each country
FROM
match_details a -- Specifying the match_details table with alias 'a'
JOIN
asst_referee_mast c ON a.ass_ref = c.ass_ref_id -- Joining the match_details table with the asst_referee_mast table on the assistant referee ID
JOIN
soccer_country b ON c.country_id = b.country_id -- Joining the asst_referee_mast table with the soccer_country table on the country ID
GROUP BY
country_name -- Grouping the results by country name
HAVING
count(DISTINCT match_no) = ( -- Filtering the results to only include rows where the count of distinct match numbers is equal to...
SELECT
max(mm) -- Selecting the maximum count of distinct match numbers
FROM
( -- Subquery to calculate the count of distinct match numbers for each country and find the maximum count
SELECT
count(DISTINCT match_no) mm -- Counting the distinct match numbers for each country and assigning the result to the alias 'mm'
FROM
match_details a -- Specifying the match_details table with alias 'a'
JOIN
asst_referee_mast c ON a.ass_ref = c.ass_ref_id -- Joining the match_details table with the asst_referee_mast table on the assistant referee ID
JOIN
soccer_country b ON c.country_id = b.country_id -- Joining the asst_referee_mast table with the soccer_country table on the country ID
GROUP BY
country_name -- Grouping the results by country name
) hh -- Assigning the subquery results to the alias 'hh'
);
Sample Output:
country_name | count --------------+------- England | 7 (1 row)
Code Explanation:
The said query in SQL that selects the name of countries and the count of distinct match numbers in the match_details table for each country.
The HAVING clause filters the results to only show the countries whose count of distinct match numbers is equal to the maximum count of distinct match numbers among all countries. The maximum count of distinct match numbers is obtained by a subquery that selects the count of distinct match numbers for each country and then selects the maximum count from those results.
The JOIN clause joins the match_details and asst_referee_mast table based on the ass_ref and ass_ref_id columns, joins the results with the soccer_country tables based on the country_id column to obtain the required data.
Alternative Solution:
Cross Join with Subquery and HAVING:
-- Selecting the country name and the count of distinct match numbers for each country where an assistant referee is involved
SELECT
b.country_name, -- Selecting the country name from the soccer_country table
COUNT(DISTINCT a.match_no) AS Match_Count -- Counting the distinct match numbers for each country and assigning the result to the alias 'Match_Count'
FROM
soccer_country b -- Specifying the soccer_country table with alias 'b'
CROSS JOIN
asst_referee_mast c -- Performing a cross join with the asst_referee_mast table with alias 'c'
LEFT JOIN
match_details a ON a.ass_ref = c.ass_ref_id AND c.country_id = b.country_id -- Left joining the match_details table with the cross join of soccer_country and asst_referee_mast tables on the assistant referee ID and country ID
GROUP BY
b.country_name -- Grouping the results by country name
HAVING
COUNT(DISTINCT a.match_no) = ( -- Filtering the results to only include rows where the count of distinct match numbers is equal to...
SELECT
MAX(cnt) -- Selecting the maximum count of distinct match numbers
FROM
( -- Subquery to calculate the count of distinct match numbers for each country and find the maximum count
SELECT
COUNT(DISTINCT match_no) AS cnt -- Counting the distinct match numbers for each country and assigning the result to the alias 'cnt'
FROM
match_details x -- Specifying the match_details table with alias 'x'
JOIN
asst_referee_mast y ON x.ass_ref = y.ass_ref_id -- Joining the match_details table with the asst_referee_mast table on the assistant referee ID
JOIN
soccer_country z ON y.country_id = z.country_id -- Joining the asst_referee_mast table with the soccer_country table on the country ID
GROUP BY
z.country_name -- Grouping the results by country name
) sub -- Assigning the subquery results to the alias 'sub'
);
Explanation:
This query uses a cross join to generate all possible combinations of country names and assistant referees. It then left joins with match details to count the distinct matches. The HAVING clause filters the results based on the match count being equal to the maximum count.
Practice Online
Sample Database: soccer
Have another way to solve this solution? Contribute your code (and comments) through Disqus.
Previous SQL Exercise: Assistant referees of each countries assists matches.
Next SQL Exercise: List the referees with their countries for each match.
What is the difficulty level of this exercise?
Test your Programming skills with w3resource's quiz.
It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.
https://w3resource.com/sql-exercises/soccer-database-exercise/sql-joins-exercise-soccer-database-47.php
- Weekly Trends and Language Statistics
- Weekly Trends and Language Statistics