SQL - COUNT 列来自基于特定值的单独表
SQL - COUNT columns from separate tables based on a certain value
我仍在学习 SQL,这是我作业的一部分。我不只是在寻找答案,而且我想了解如何解决这个问题,因为我什至不知道该在线搜索什么。
在作业的一部分,我们给出了一个问题和一个示例输出。我们必须将数据插入到我们创建的表中,并编写一个 SQL 查询,该查询将 return 结果回答问题。
这个特定的问题是这样的:
"对于每个办公室,显示其郊区、经理姓名、办公室员工总数(不包括经理)以及待售房源数量。"
涉及到3个表(我去掉了不需要的列):
- 办公室 (id, office_manager_id, office_suburb)
- 工作人员 (id, office_id)
- 列表(id,office_id,staff_id , buyer_id)
输出示例如下:
Office Suburb | Manager | No. of Staff | No of Listing for Sale |
New York | Johnny | 2 | 5 |
我想我可以用 COUNT 和 GROUP BY 来做到这一点,但是一旦我尝试连接 3 个表并使用 COUNT,行数就会变得疯狂,所以我的计数 'No. of Staff' 和'No. of Listing for Sale'变得一样。
如果我分别计算它们(仅使用 2 个表,例如 Office 和 Listing 或 Office 和 Staff),那么我可以获得所需的 COUNT 个输出。
这是我目前得到的:
SELECT
o.office_suburb AS "Office Suburb",
(s.first_name || ' ' || s.last_name) AS "Manager",
COUNT(s.salary)-1 AS "No. of Staff",
COUNT(l.id) AS "No. of Listings for Sale"
FROM staff s, office o, listing l
WHERE o.id = s.office_id
AND s.id = o.office_manager_id
AND o.id = l.office_id
AND s.id = l.staff_id
AND l.buyer_id IS NULL
GROUP BY o.office_suburb, s.first_name, s.last_name
如果有人能帮助我指明方向,我将不胜感激。我尝试搜索 'count multiple tables'、'group by with 3 tables' 等术语,但没有成功。即使您可以提供类似以下内容的帮助:“只需搜索 xyz,这就是您所需要的”,我将不胜感激...
谢谢。
PS:我们学习如何连接表的方法是使用 WHERE 子句,这就是为什么我的 SQL 使用 WHERE 而不是 JOIN。这也是在 Oracle ApEx 中完成的。
我会推荐相关子查询,但是像这样:
SELECT o.office_suburb, (sm.first_name || ' ' || sm.last_name) AS Manager,
(SELECT COUNT(*)
FROM staff s2
WHERE s2.office_id = o.id
) as num_staff,
(SELECT COUNT(*)
FROM listings l
WHERE l.office_id = o.id AND l.buyer_id IS NULL
) as num_listings
FROM office o JOIN
staff sm
ON sm.id = o.office_manager_id ;
注意使用正确、明确、标准、可读的JOIN
语法。此外,外部查询中不需要 GROUP BY
。
重点是每个 office
每个 office_manager
和 office_suburb
都有一个唯一的 id
,所以像下面这样的东西会有帮助。由于我最初的答案是错误的,因此我必须进行相应的编辑。您可以在以下查询中使用 JOIN
。
SELECT
o2.office_suburb AS "Office Suburb",
(s2.first_name || ' ' || s2.last_name) AS "Manager",
p.csid AS "No. of Staff",
p.clid AS "No. of Listings for Sale"
FROM
(SELECT
o.id,
COUNT(s.id) AS csid,
COUNT(l.id) AS clid
FROM office o
JOIN staff s ON (o.id = s.office_id)
JOIN listing l ON (o.id = l.office_id AND s.id = l.staff_id)
WHERE l.staff_id <> o.office_manager_id AND l.buyer_id IS NULL
GROUP BY o.id) p
JOIN office o2 ON p.id = o2.id
JOIN staff s2 ON s2.id = o2.office_manager_id AND s2.office_id = o2.id
您可以在SQL Fiddle
中查看结果
我仍在学习 SQL,这是我作业的一部分。我不只是在寻找答案,而且我想了解如何解决这个问题,因为我什至不知道该在线搜索什么。
在作业的一部分,我们给出了一个问题和一个示例输出。我们必须将数据插入到我们创建的表中,并编写一个 SQL 查询,该查询将 return 结果回答问题。
这个特定的问题是这样的: "对于每个办公室,显示其郊区、经理姓名、办公室员工总数(不包括经理)以及待售房源数量。"
涉及到3个表(我去掉了不需要的列):
- 办公室 (id, office_manager_id, office_suburb)
- 工作人员 (id, office_id)
- 列表(id,office_id,staff_id , buyer_id)
输出示例如下:
Office Suburb | Manager | No. of Staff | No of Listing for Sale |
New York | Johnny | 2 | 5 |
我想我可以用 COUNT 和 GROUP BY 来做到这一点,但是一旦我尝试连接 3 个表并使用 COUNT,行数就会变得疯狂,所以我的计数 'No. of Staff' 和'No. of Listing for Sale'变得一样。
如果我分别计算它们(仅使用 2 个表,例如 Office 和 Listing 或 Office 和 Staff),那么我可以获得所需的 COUNT 个输出。
这是我目前得到的:
SELECT
o.office_suburb AS "Office Suburb",
(s.first_name || ' ' || s.last_name) AS "Manager",
COUNT(s.salary)-1 AS "No. of Staff",
COUNT(l.id) AS "No. of Listings for Sale"
FROM staff s, office o, listing l
WHERE o.id = s.office_id
AND s.id = o.office_manager_id
AND o.id = l.office_id
AND s.id = l.staff_id
AND l.buyer_id IS NULL
GROUP BY o.office_suburb, s.first_name, s.last_name
如果有人能帮助我指明方向,我将不胜感激。我尝试搜索 'count multiple tables'、'group by with 3 tables' 等术语,但没有成功。即使您可以提供类似以下内容的帮助:“只需搜索 xyz,这就是您所需要的”,我将不胜感激...
谢谢。
PS:我们学习如何连接表的方法是使用 WHERE 子句,这就是为什么我的 SQL 使用 WHERE 而不是 JOIN。这也是在 Oracle ApEx 中完成的。
我会推荐相关子查询,但是像这样:
SELECT o.office_suburb, (sm.first_name || ' ' || sm.last_name) AS Manager,
(SELECT COUNT(*)
FROM staff s2
WHERE s2.office_id = o.id
) as num_staff,
(SELECT COUNT(*)
FROM listings l
WHERE l.office_id = o.id AND l.buyer_id IS NULL
) as num_listings
FROM office o JOIN
staff sm
ON sm.id = o.office_manager_id ;
注意使用正确、明确、标准、可读的JOIN
语法。此外,外部查询中不需要 GROUP BY
。
重点是每个 office
每个 office_manager
和 office_suburb
都有一个唯一的 id
,所以像下面这样的东西会有帮助。由于我最初的答案是错误的,因此我必须进行相应的编辑。您可以在以下查询中使用 JOIN
。
SELECT
o2.office_suburb AS "Office Suburb",
(s2.first_name || ' ' || s2.last_name) AS "Manager",
p.csid AS "No. of Staff",
p.clid AS "No. of Listings for Sale"
FROM
(SELECT
o.id,
COUNT(s.id) AS csid,
COUNT(l.id) AS clid
FROM office o
JOIN staff s ON (o.id = s.office_id)
JOIN listing l ON (o.id = l.office_id AND s.id = l.staff_id)
WHERE l.staff_id <> o.office_manager_id AND l.buyer_id IS NULL
GROUP BY o.id) p
JOIN office o2 ON p.id = o2.id
JOIN staff s2 ON s2.id = o2.office_manager_id AND s2.office_id = o2.id
您可以在SQL Fiddle
中查看结果