2013-06-17 3 views
0

У меня есть стол для футбольных клубов страны. Поля «teamName», «playerName» и «country».Как считать команды без иностранных игроков

Я хотел бы рассчитывать клубы, что все их игроки являются иностранцами

. Я попробовал следующий запрос, но я думаю, что он не работает, поскольку кажется, что он имеет значение, когда у нас есть хотя бы один иностранец, но я хочу, чтобы он подсчитал, все ли игроки команды являются иностранцами!

SELECT COUNT(DISTINCT teamName) 
FROM teams 
WHERE country not like '%England%' 

Просьба сообщить. Благодаря!

+0

Можно ли разместить образец структуры таблицы? – Kevin

ответ

4

Один из способов будет:

SELECT COUNT(DISTINCT teamName) 
FROM teams T1 
WHERE NOT EXISTS 
(select * from teams T2 
    WHERE T1.teamName=T2.teamName and T2.country like '%England%') 
+1

+1 для 'существует'. –

+0

OP хочет подсчитать клубы, что «все их игроки являются иностранцами». Внимательно посмотрите на вопрос –

+0

Да, команды, в которых нет английского игрока. (Отредактировано для удаления double-neg.) –

0

Хмм даже присоединиться, кажется, нужен внутренний запрос:

SELECT COUNT(*) 
FROM (
    SELECT teamName, 
    SUM(country like '%England%') AS Locals 
    FROM teams 
    GROUP BY teamName 
) AS t 
WHERE Locals = 0; 

кажется, что там должны быть короче ответ, хотя ...

0

Быстрый и грязный ответ,, и только один проход через данные, без подзапроса. Это выбирает команды, которые являются иностранными. Вы можете играть с выражением CASE, если это не то, что вы хотите.

SELECT team_name 
FROM teams 
GROUP BY team_name 
HAVING COUNT(country)= 
     SUM(CASE country != 'England' WHEN TRUE THEN 1 ELSE 0 END); 

Более длинный ответ: Ваша схема не нормируется, но должно быть. Вам нужна таблица teams и вторая таблица players, которая включает в себя внешний ключ в таблице команд для текущей команды этого игрока. Это базовая нормализация БД. Однако, заменяя одну таблицу в FROM на объединение этих двух таблиц, работает тот же GROUP BY/HAVING трюк.

Смежные вопросы