如何使用计数和分组依据作为另一个表的条件

时间:2018-11-28 01:31:20

标签: sql sqlite

因此,作为序言,我是计算机科学专业的一年级学生,我们才刚刚开始使用SQL,因此,如果解决方案显而易见,请原谅我。

我们得到了Zoo的数据库,该数据库具有用于Animals,Keepers的表以及用于护理角色的链接实体(如果正确的话),将两者连接起来。 (以下示意图)

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 :(得分:1)

您的查询应该返回错误,因为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子句来满足要求。