Как использовать количество и группировать в качестве условия для другой таблицы - PullRequest
0 голосов
/ 28 ноября 2018

Итак, предисловие, я студент первого курса компьютерных наук, и мы только начали работать с SQL, так что простите, если решение кажется очевидным.

Нам дали базу данных для Zoo,в которой есть таблицы для животных, хранителей и сущность ссылки (если это правильное слово) для ролей по уходу, связывающих их.(Схема ниже)

CREATE TABLE Animal (ID VARCHAR(6) PRIMARY KEY, Name VARCHAR(10), Species 
VARCHAR(20),
Age SMALLINT, Sex VARCHAR(1), Weight SMALLINT, F_ID VARCHAR(6), M_ID 
VARCHAR(6));

CREATE TABLE Keeper (Staff_ID VARCHAR(6) PRIMARY KEY, Keeper_Name 
VARCHAR(20), Specialisation VARCHAR(20));

CREATE TABLE Care_Role (ID VARCHAR(6), Staff_ID VARCHAR(6), Role 
VARCHAR(10), PRIMARY KEY (ID, Staff_ID));

Теперь перед нами стоит задача выяснить, какие Хранители ухаживают за более чем 10 животными одного и того же вида, используя следующие данные:

INSERT INTO Animal VALUES 
    ('11', 'Horace', 'Marmoset', 99, 'M', 5, '2','1'),
    ('12', 'sghgdht', 'Marmoset', 42, 'M', 3, '2','1'),
    ('13', 'xgnyn', 'Marmoset', 37, 'F', 3, '1','11'),
    ('14', 'sbfdfbng', 'Marmoset', 12, 'F', 3, '1','11'),
    ('15', 'fdghd', 'Marmoset', 12, 'M', 3, '1','11'),
    ('16', 'Fred', 'Marmoset', 6, 'M', 3, '15','1'),
    ('17', 'Mary', 'Marmoset', 3, 'F', 3, '8','14'),
    ('18', 'Jane', 'Marmoset', 5, 'F', 3, '7','13'),
    ('19', 'dfgjtjt', 'Marmoset', 5, 'M', 3, '16','17'),
    ('20', 'Eric', 'Marmoset', 5, 'M', 3, '12','13'),
    ('21', 'tukyufyu', 'Marmoset', 5, 'M', 3, '12','73'),
    ('31', 'hgndghmd', 'Giraffe', 99, 'M', 5, '201','1'),
    ('32', 'sghgdht', 'Giraffe', 42, 'M', 3, '201','1'),
    ('33', 'xgnyn', 'Giraffe', 37, 'F', 3, '111','1'),
    ('34', 'sbfdfbng', 'Giraffe', 12, 'F', 3, '111','1'),
    ('35', 'fdghd', 'Giraffe', 12, 'M', 3, '111','6'),
    ('36', 'Fred', 'Lion', 6, 'M', 3, '151','111'),
    ('37', 'Mary', 'Lion', 3, 'F', 3, '81','114'),
    ('38', 'Jane', 'Lion', 5, 'F', 3, '71','113'),
    ('39', 'Kingsly', 'Lion', 9, 'M', 3, '161','117'),
    ('40', 'Eric', 'Lion', 11, 'M', 3, '121','113'),
    ('41', 'tukyufyu', 'Lion', 2, 'M', 3, '121','173'),
    ('61', 'hgndghmd', 'Elephant', 6, 'F', 225, '201','111'),
    ('62', 'sghgdht', 'Elephant', 10, 'F', 230, '201','111'),
    ('63', 'xgnyn', 'Elephant', 5, 'F', 300, '111','121'),
    ('64', 'sbfdfbng', 'Elephant', 11, 'F', 173, '111','121'),
    ('65', 'fdghd', 'Elephant', 12, 'F', 231, '111','666'),
    ('66', 'Fred', 'Elephant', 17, 'F', 333, '151','147'),
    ('67', 'Mary', 'Elephant', 3, 'F', 272, '81','148'),
    ('68', 'Jane', 'Elephant', 8, 'F', 47, '71','136'),
    ('69', 'dfgjtjt', 'Elephant', 9, 'F', 131, '161','172'),
    ('70', 'Eric', 'Elephant', 10, 'F', 333, '121','136'),
    ('71', 'tukyufyu', 'Elephant', 7, 'M', 114, '121','731');

INSERT INTO Keeper VALUES 
    ('1', 'Roger', 'tdfhuihiu'),
    ('2', 'Sidra', 'rgegegtnrty'),
    ('3', 'Amit', 'ergetetnt'),
    ('4', 'Lucia', 'dvojivhwivih');

INSERT INTO Care_Role VALUES 
    ('32', '1', 'feeding'),
    ('32', '2', 'washing'),
    ('61', '1', 'feeding'),
    ('62', '1', 'feeding'),
    ('63', '1', 'feeding'),
    ('64', '1', 'feeding'),
    ('65', '1', 'feeding'),
    ('66', '1', 'feeding'),
    ('67', '1', 'feeding'),
    ('68', '1', 'feeding'),
    ('69', '1', 'feeding'),
    ('70', '1', 'feeding'),
    ('71', '1', 'feeding'),
    ('11', '4', 'feeding'),
    ('12', '4', 'feeding'),
    ('13', '4', 'feeding'),
    ('14', '4', 'feeding'),
    ('15', '4', 'feeding'),
    ('16', '4', 'feeding'),
    ('17', '4', 'feeding'),
    ('18', '4', 'feeding'),
    ('19', '4', 'feeding'),
    ('20', '4', 'feeding'),
    ('21', '4', 'feeding');

Пока что мне удалось придумать вот что:

SELECT Keeper.Keeper_Name, Animal.Species, COUNT(Animal.Species)
FROM Keeper
    JOIN Care_Role
        ON Keeper.Staff_ID = Care_Role.Staff_ID
    JOIN Animal 
        ON Care_Role.ID = Animal.ID
GROUP BY Animal.Species

Но это возвращает больше, чем просто имя (что я и хочу), а также показывает всех людейкто присматривал за животными, а не только за теми, кто присматривал за 10 или более, мне было интересно, есть ли у кого-нибудь идеи о том, как помочь с этим?Большое спасибо!

1 Ответ

0 голосов
/ 28 ноября 2018

Ваш запрос должен возвращать ошибку, потому что Keeper.Keeper_name отсутствует в GROUP BY.Вы сделали хорошую попытку.Разумный способ начать запрос:

SELECT k.Keeper_Name, a.Species, COUNT(*)
FROM Keeper k JOIN
     Care_Role cr
     ON k.Staff_ID = cr.Staff_ID JOIN
     Animal a
     ON cr.ID = a.ID
GROUP BY k.Keeper_Name, a.Species;

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

Обратите внимание на следующее:

  • Псевдонимы таблицы являются сокращениями для таблицы.
  • Все имена столбцов являются квалифицированными.
  • Используется сокращение отCOUNT(*) вместо подсчета определенного столбца.

Ваш вопрос добавляет дополнительное условие о 10 животных.Вы можете использовать это в выражении HAVING.

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