SQLite - 如果为null,则返回0

时间:2016-10-19 17:06:56

标签: database sqlite

我在数据库管理系统中有一项任务,我必须为给定的问题编写查询。 我有4个问题,其中我解决了3个并坚持使用最后一个。

详细信息:

  • 使用Chinook数据库的1.4版https://chinookdatabase.codeplex.com/)。
  • SQLite数据库浏览器
  • 使用Chinook文件的目录中的
  • Chinook Sqlite AutoIncrementPKs.sqlite 文件是我正在处理的数据库

问题陈述: 编写查询以根据通过客户发票带来的金额来生成员工的排名列表,他们是支持代表。结果集(见下图)应该为所有员工(即使是那些不支持任何客户的员工)提供以下字段(按顺序):ID(e_id),名字(e_first名称),姓氏(e_last_name),标题(e_title)和发票总额(total_invoices)。行应按发票总额(最大的第一个)排序,然后按姓氏(按字母顺序)排序,然后按名字(按字母顺序)排序。发票总额前面应加一个美元符号($),小数点后面有两位数(适当时四舍五入);如果员工没有任何发票,您应该输出$ 0.00,而不是NULL。您可能会发现查看SQLite的IFNULL,ROUND和PRINTF函数很有用。

期望的输出:

enter image description here

我的查询:

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

我的输出:

enter image description here

正如您所看到的,前三行是正确的,但后面的行没有打印,因为员工没有任何发票,因此EmployeeID为空。

如何在这种情况下打印行? 我尝试使用 Coalesce ifnull 函数,但我无法让它们工作。

如果有人可以修改我的查询以获得匹配的解决方案,我真的很感激。 谢谢!

P.S :这是Chinook数据库的架构

enter image description here

1 个答案:

答案 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(...)