SQL: подсчитывать экземпляры одного атрибута на другой - PullRequest
0 голосов
/ 06 мая 2020

Я изучаю SQL и поставил, казалось бы, простую задачу. У меня есть список вымышленных людей, которым был присвоен рейтинг интеллекта от 1 (немного нечетко) до 5 (Эйнштейн, берегись!), И чей пол указан:

name  gender intelligence
Bob   Male   4
Jane  Female 5
Gary  Male   1
Linda Female 2
Stan  Male   2
Barb  Female 4
... list truncated...

Что я хотел бы это отчет, «для каждого уровня интеллекта, сколько мужчин и сколько женщин? Для выборки я ищу что-то вроде этого:

Intelligence    Male    Female
1               1       0
2               1       1
3               0       0
4               1       1
5               0       1

Это достаточно просто, чтобы придумать список каждого уровня интеллекта:

SELECT DISTINCT(intelligence) from table ORDER BY intelligence;

Теперь моя универсальная программистская сторона советует построить al oop вокруг этого, но это кажется неправильным и (по-видимому) непростым. Или, по крайней мере, недостаточно просто для моих новичков. Любые предложения о том, как выполнить sh это? Действительно ли это сложнее, чем я думаю? Я узнал об основах запросов - IN, LIKE, HAVING, CASE, вложенный SELECT, et c.

Моя более общая цель - иметь возможность отвечать на такие вопросы, как «Для каждого типа X, найденного в таблице, сколько существует каждого типа Y?»

1 Ответ

2 голосов
/ 06 мая 2020

Использовать условное агрегирование:

select intelligence, sum(gender = 'Male') as num_males, sum(gender = 'Female') as num_females
from t
group by intelligence;

SQLite обрабатывает логические выражения как числа, где «1» соответствует истине, а «0» - ложному. В других базах данных вам обычно требуется явное case:

select intelligence,
       sum(case when gender = 'Male' then 1 else 0 end) as num_males,
       sum(case when gender = 'Female' then 1 else 0 end) as num_females
from t
group by intelligence;

Конечно, это также работает в SQLite, но более подробное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...