基于Northwind数据库创建带国家参数的SQL Server员工收入统计函数
解决Northwind数据库员工年度收入统计的自定义函数需求
没问题,我来帮你搞定这个SQL Server自定义函数的需求。咱们基于Northwind数据库的表结构,一步步实现按指定国家统计员工1996-1998年的年度总收入:
1. 表值函数实现代码
这里创建一个表值函数,因为要返回多行多列的统计结果,是最适合这类需求的函数类型:
CREATE FUNCTION dbo.GetEmployeeYearlyRevenue(@ShipCountry VARCHAR(50)) RETURNS TABLE AS RETURN ( SELECT e.LastName, -- 1996年总收入,无对应订单则显示0 ISNULL(SUM(CASE WHEN YEAR(o.OrderDate) = 1996 THEN od.UnitPrice * od.Quantity * (1 - od.Discount) END), 0) AS Revenue1996, -- 1997年总收入 ISNULL(SUM(CASE WHEN YEAR(o.OrderDate) = 1997 THEN od.UnitPrice * od.Quantity * (1 - od.Discount) END), 0) AS Revenue1997, -- 1998年总收入 ISNULL(SUM(CASE WHEN YEAR(o.OrderDate) = 1998 THEN od.UnitPrice * od.Quantity * (1 - od.Discount) END), 0) AS Revenue1998 FROM Employees e LEFT JOIN Orders o ON e.EmployeeID = o.EmployeeID LEFT JOIN [Order Details] od ON o.OrderID = od.OrderID WHERE o.ShipCountry = @ShipCountry OR o.ShipCountry IS NULL -- 保留无对应国家订单的员工 GROUP BY e.LastName ORDER BY e.LastName );
2. 核心逻辑解释
- 表关联:通过
EmployeeID关联员工表和订单表,再通过OrderID关联订单表与订单明细表,确保能追踪到每笔订单对应的员工和实际营收。 - 收入计算:用
UnitPrice * Quantity * (1 - Discount)计算单条订单明细的实际收入,这是Northwind数据库里标准的营收计算方式(扣除折扣后的实际到账金额)。 - 按年拆分:通过
CASE WHEN配合SUM实现条件聚合,把不同年份的收入拆分成单独列;ISNULL处理了员工某年度无订单的情况,避免返回NULL,统一显示0。 - LEFT JOIN:保留所有员工记录,即使该员工在指定国家没有任何订单,不会遗漏数据。
3. 函数调用示例
创建完成后,直接通过SELECT语句调用即可查询指定国家的结果:
-- 查询德国员工的1996-1998年度收入 SELECT * FROM dbo.GetEmployeeYearlyRevenue('Germany'); -- 查询美国员工的对应年度收入 SELECT * FROM dbo.GetEmployeeYearlyRevenue('USA');
4. 扩展提示
如果后续需要支持动态年份范围,你可以把起始和结束年份改成函数参数传入,但针对你指定的1996-1998年需求,当前实现已经完全满足。执行前记得确认你有创建函数的权限,且当前数据库是Northwind。
内容的提问来源于stack exchange,提问作者Jplaudir8
相关产品推荐
相关产品推荐

