You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:18:06