我在数据库管理系统中有一项任务,我必须为给定的问题编写查询。 我有4个问题,其中我解决了3个并坚持使用最后一个。
详细信息:
问题陈述: 编写查询以根据通过客户发票带来的金额来生成员工的排名列表,他们是支持代表。结果集(见下图)应该为所有员工(即使是那些不支持任何客户的员工)提供以下字段(按顺序):ID(e_id),名字(e_first名称),姓氏(e_last_name),标题(e_title)和发票总额(total_invoices)。行应按发票总额(最大的第一个)排序,然后按姓氏(按字母顺序)排序,然后按名字(按字母顺序)排序。发票总额前面应加一个美元符号($),小数点后面有两位数(适当时四舍五入);如果员工没有任何发票,您应该输出$ 0.00,而不是NULL。您可能会发现查看SQLite的IFNULL,ROUND和PRINTF函数很有用。
期望的输出:
我的查询:
Select Employee.EmployeeId as e_id,
Employee.FirstName as e_first_name,
Employee.LastName as e_last_name,
Employee.Title as e_title,
'$' || printf("%.2f", Sum(Invoice.Total)) as total_invoices
From Invoice Inner Join Customer On Customer.CustomerId = Invoice.CustomerId
Inner Join Employee On Employee.EmployeeId = Customer.SupportRepId
Group by Employee.EmployeeId
Having Invoice.CustomerId in
(Select Customer.CustomerId From Customer
Where Customer.SupportRepId in
(Select Employee.EmployeeId From Employee Inner Join Customer On Employee.EmployeeId = Customer.SupportRepId)
)
order by sum(Invoice.Total) desc
我的输出:
正如您所看到的,前三行是正确的,但后面的行没有打印,因为员工没有任何发票,因此EmployeeID为空。
如何在这种情况下打印行? 我尝试使用 Coalesce 和 ifnull 函数,但我无法让它们工作。
如果有人可以修改我的查询以获得匹配的解决方案,我真的很感激。 谢谢!
P.S :这是Chinook数据库的架构
答案 0 :(得分:1)
经常发生使用子查询更简单:
SELECT EmployeeId,
FirstMame,
LastName,
Title,
(SELECT printf("...", ifnull(sum(Total), 0))
FROM Invoice
JOIN Customer USING (CustomerId)
WHERE Customer.SupportRepId = Employee.EmployeeId
) AS total_invoices
FROM Employee
ORDER BY total_invoices DESC;
(内连接也可以用子查询替换。)
但有可能你应该证明你已经了解了outer joins,如果找不到匹配的行,它会生成一个包含NULL值的假行:
...
FROM Employee
LEFT JOIN Customer ON Employee.EmployeeId = Customer.SupportRepId
LEFT JOIN Invoice USING (CustomerID)
...
如果您想成为智能手机,请将ifnull(sum(...), 0)
替换为total(...)
。