SQL数据库如何处理复杂Schema及编写员工对应客户发票总额查询
SQL查询解决方案
通用表结构假设
以下是最常见的对应业务场景的表设计,如果你的实际库表结构存在差异,调整对应字段名、关联关系即可:
employees员工表:存储员工全量基础信息,主键为employee_id,其余为你需要返回的员工属性字段(如姓名、部门、入职时间等)customers客户表:存储客户全量信息,主键为customer_id,外键serviced_employee_id关联对接该客户的员工IDinvoices发票表:存储所有客户产生的发票记录,主键为invoice_id,外键customer_id关联对应客户,amount字段存储单张发票的金额
查询语句
场景1:返回所有员工,无对应发票的员工总额展示为0
SELECT e.*, COALESCE(SUM(i.amount), 0) AS total_invoice_amount FROM employees e LEFT JOIN customers c ON e.employee_id = c.serviced_employee_id LEFT JOIN invoices i ON c.customer_id = i.customer_id -- 如需按时间范围筛选发票,放开下方注释修改时间即可 -- WHERE i.invoice_date >= '2024-01-01' AND i.invoice_date < '2025-01-01' GROUP BY e.employee_id;
注意:如果你的数据库开启了严格分组模式(如MySQL的ONLY_FULL_GROUP_BY),需要将SELECT子句中用到的所有员工表非聚合字段都加入GROUP BY,或者用
ANY_VALUE()包裹非分组的员工字段。
场景2:仅返回有对应发票产生的员工
SELECT e.*, SUM(i.amount) AS total_invoice_amount FROM employees e INNER JOIN customers c ON e.employee_id = c.serviced_employee_id INNER JOIN invoices i ON c.customer_id = i.customer_id GROUP BY e.employee_id;
内容的提问来源于stack exchange,提问作者rizwan rasheed
相关产品推荐
相关产品推荐

