Если вам нужны все результаты (без удаления дубликатов), вы можете использовать UNION ALL вместо UNION.В этом случае результаты станут следующими:
League total1
------------------------
1 20
2 10
1 40
2 10
Однако, чтобы получить желаемый результат, вы можете попробовать:
SELECT
league = COALESCE(Totals1.league, Totals2.league),
total_1 = COALESCE(Totals1.total_1, 0),
total_2 = COALESCE(Totals2.total_2, 0)
FROM
(SELECT league, COUNT(*) as total_1
FROM Games
WHERE score_away is not null and score_home is not null
GROUP BY league) as Totals1
FULL JOIN
(SELECT league, COUNT(*) as total_2
FROM Games
WHERE score_away is null and score_home is null
GROUP BY league) as Totals2
ON Totals1.league = Totals2.league;
Редактировать: только что исправили итоги врезультат должен возвращать 0 вместо NULL.
Редактировать 2: На основании вашего запрошенного расширения в ваших комментариях я изменил свой запрос, включив в него процентные вычисления следующим образом:
SELECT
league = COALESCE(Totals1.league, Totals2.league),
total_1 = COALESCE(Totals1.total_1, 0),
total_2 = COALESCE(Totals2.total_2, 0),
percent_1 = 100 * COALESCE(Totals1.total_1, 0) / (COALESCE(Totals1.total_1, 0) + COALESCE(Totals2.total_2, 0)),
percent_2 = 100 * COALESCE(Totals2.total_2, 0) / (COALESCE(Totals1.total_1, 0) + COALESCE(Totals2.total_2, 0))
FROM
(SELECT league, COUNT(*) AS total_1
FROM Games
WHERE score_away IS NOT NULL AND score_home IS NOT NULL
GROUP BY league) AS Totals1
FULL JOIN
(SELECT league, COUNT(*) as total_2
FROM Games
WHERE score_away IS NULL AND score_home IS NULL
GROUP BY league) AS Totals2
ON Totals1.league = Totals2.league
ORDER BY percent_1;
Чтобы сделатьПроцент вычислений более читабелен, вы можете поместить исходный запрос как подзапрос в табличное выражение.Например:
SELECT
league,
total_1,
total_2,
percent_1 = 100 * total_1 / (total_1 + total_2),
percent_2 = 100 * total_2 / (total_1 + total_2)
FROM
(
SELECT
league = COALESCE(Totals1.league, Totals2.league),
total_1 = COALESCE(Totals1.total_1, 0),
total_2 = COALESCE(Totals2.total_2, 0)
FROM
(SELECT league, COUNT(*) AS total_1
FROM Games
WHERE score_away IS NOT NULL AND score_home IS NOT NULL
GROUP BY league) AS Totals1
FULL JOIN
(SELECT league, COUNT(*) as total_2
FROM Games
WHERE score_away IS NULL AND score_home IS NULL
GROUP BY league) AS Totals2
ON Totals1.league = Totals2.league
) AS Sub
ORDER BY percent_1;
Мне лично не нравятся сложные «анонимные» табличные выражения в предложении FROM, и я бы преобразовал их в общее табличное выражение, например:
WITH
Sub AS
(
SELECT
league = COALESCE(Totals1.league, Totals2.league),
total_1 = COALESCE(Totals1.total_1, 0),
total_2 = COALESCE(Totals2.total_2, 0)
FROM
(SELECT league, COUNT(*) AS total_1
FROM Games
WHERE score_away IS NOT NULL AND score_home IS NOT NULL
GROUP BY league) AS Totals1
FULL JOIN
(SELECT league, COUNT(*) as total_2
FROM Games
WHERE score_away IS NULL AND score_home IS NULL
GROUP BY league) AS Totals2
ON Totals1.league = Totals2.league
)
SELECT
league,
total_1,
total_2,
percent_1 = 100 * total_1 / (total_1 + total_2),
percent_2 = 100 * total_2 / (total_1 + total_2)
FROM Sub
ORDER BY percent_1;
И при рефакторингеподобный запрос, я бы также преобразовал два других табличных выражения (два подзапроса SELECT в таблице игр) в общие табличные выражения:
WITH
Totals1 AS
(
SELECT league, COUNT(*) AS total_1
FROM Games
WHERE score_away IS NOT NULL AND score_home IS NOT NULL
GROUP BY league
),
Totals2 AS
(
SELECT league, COUNT(*) as total_2
FROM Games
WHERE score_away IS NULL AND score_home IS NULL
GROUP BY league
),
Sub AS
(
SELECT
league = COALESCE(Totals1.league, Totals2.league),
total_1 = COALESCE(Totals1.total_1, 0),
total_2 = COALESCE(Totals2.total_2, 0)
FROM
Totals1
FULL JOIN Totals2 ON Totals1.league = Totals2.league
)
SELECT
league,
total_1,
total_2,
percent_1 = 100 * total_1 / (total_1 + total_2),
percent_2 = 100 * total_2 / (total_1 + total_2)
FROM Sub
ORDER BY percent_1;
Конечно, то же самое можно сделать с исходным запросомиз LukStorms, поместив его в общее табличное выражение:
WITH
Sub AS
(
SELECT
league,
total_1 = SUM(CASE WHEN score_away IS NOT NULL AND score_home IS NOT NULL THEN 1 ELSE 0 END),
total_2 = SUM(CASE WHEN score_away IS NULL AND score_home IS NULL THEN 1 ELSE 0 END)
FROM Games
GROUP BY league
)
SELECT
league,
total_1,
total_2,
percent_1 = 100 * total_1 / (total_1 + total_2),
percent_2 = 100 * total_2 / (total_1 + total_2)
FROM Sub
ORDER BY percent_1;
Опять же, в этом случае, как я вижу, запрос LukStorms короче, элегантнее и, вероятно, быстрее.
NB1: проценты в настоящее время являются целыми числами.Если вы хотите использовать дробные проценты, вы можете заменить 100 на 100,0
Примечание: при использовании общих табличных выражений (с помощью предложения WITH) в сценарии SQL или хранимой процедуре обратите внимание, что потребуется разделитьпредыдущий запрос (перед ключевым словом WITH) с точкой с запятой.В противном случае SQL Server будет выдавать ошибку с ошибкой.