SQL - COUNT 列来自基于特定值的单独表

SQL - COUNT columns from separate tables based on a certain value

我仍在学习 SQL,这是我作业的一部分。我不只是在寻找答案,而且我想了解如何解决这个问题,因为我什至不知道该在线搜索什么。

在作业的一部分,我们给出了一个问题和一个示例输出。我们必须将数据插入到我们创建的表中,并编写一个 SQL 查询,该查询将 return 结果回答问题。

这个特定的问题是这样的: "对于每个办公室,显示其郊区、经理姓名、办公室员工总数(不包括经理)以及待售房源数量。"

涉及到3个表(我去掉了不需要的列):

输出示例如下:

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_manageroffice_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

中查看结果