【问题标题】:SQL joining and counting 3 tables and including NULL [closed]SQL加入和计算3个表,包括NULL [关闭]
【发布时间】:2020-12-24 09:04:59
【问题描述】:

Link to relevant schema in question

对于 SQL。进行查询以显示 所有 已帮助客户的员工并显示他们的发票数量。我的问题是我可以显示员工人数和 ID,但我无法从查询中显示所有员工。

输出应该类似于

ID - Last - First - COUNT(invoices)

如果为 NULL,名称也应该显示出来。

我试过了:

SELECT e.EmployeeId,e.LastName, e.FirstName, COUNT() as NUM_INVOICE
FROM employees AS e
LEFT OUTER JOIN customers as c ON e.EmployeeId=c.SupportRepId
INNER JOIN invoices as i ON c.CustomerId =i.CustomerId
GROUP BY e.EmployeeId
ORDER BY NUM_INVOICE DESC

它给了:Output from my best attempt

问题是,这没有显示没有通过客户表和发票表连接的任何发票的剩余 id。它缺少雇员表中的 5 个名称,它们应该显示 NULL 作为计数。我认为左内连接可以解决这个问题并“带来”员工表中的名称,但它们被删除了。

【问题讨论】:

标签: mysql sql count left-join sql-order-by


【解决方案1】:

问题在于,这没有显示剩余的 id 没有通过客户表和发票表连接的任何发票。

然后,使用LEFT JOIN

SELECT 
    e.EmployeeId, e.LastName, e.FirstName, COUNT(i.CustomerId) AS NUM_INVOICE
FROM employees AS e
LEFT JOIN customers AS c ON e.EmployeeId = c.SupportRepId
LEFT JOIN invoices AS i ON c.CustomerId = i.CustomerId
GROUP BY e.EmployeeId
ORDER BY NUM_INVOICE DESC

【讨论】:

  • 并将COUNT(*)更改为COUNT(i.InvoiceId),以免将零发票计为1(即不计算外部连接的空发票)。
  • 这非常接近预期的解决方案!我已经在问题中加入了 2 个 LEFT JOIN,就像你遇到的一样,但我放弃了它,因为我得到的计数是 1 而不是 0。我没有输入 'COUNT(i.CustomerId)',我只是在使用 COUNT( ),所以即使客户表中有多余的几行,它仍然会显示 1 而不是 0。结果应该显示为 NULL。
  • @Michael Racz:如果您想要 null 而不是零,请使用 NULLIF(COUNT(i.CustomerId), 0)
【解决方案2】:

只是为了展示另一种选择:我更喜欢在加入数据之前汇总数据。在这里,我会将发票计数加入员工:

select e.employeeid, e.lastname, e.firstname, coalesce(ic.cnt, 0) as num_invoice
from employees as e
left outer join
(
  select c.supportrepid, count(*) as cnt
  from customers as c 
  inner join invoices as i on i.customerid = c.customerid
  group by c.supportrepid
) ic on ic.supportrepid = e.employeeid
order by num_invoice desc;

【讨论】:

  • 我读对了吗?您将整个查询放在左外连接之前作为您从中提取它的位置,然后您将其称为 ic?
  • 是的,我从员工中选择并外部加入子查询结果,该结果为我提供每个员工的发票计数。我将此子查询结果 ic 称为“已计数的发票”,但您当然可以使用任何其他对您来说更易读的名称。
  • 顺便加入子查询是很常见的。毕竟,查询结果又是一个可以连接的表。在那些支持WITH 子句的 DBMS 中(MySQL 从版本 8 开始支持),您可以在实际查询之前创建这些临时视图,许多人认为这些视图更具可读性。
猜你喜欢
  • 2013-06-19
  • 2023-02-03
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
相关资源
最近更新 更多