SQL 服务器 - 使用 northwind 数据库创建函数
SQL Server - creating a function using the northwind database
在开始之前,我想让你知道我使用的是微软著名的northwind数据库。
所以,我需要创建一个函数来检索以下结果集:
查询需要创建一个接收国家名称(table 订单的 shipCountry 字段)作为参数的函数,它必须输出员工的姓氏([=32 的 lastName 字段) =] Employees) 以及在函数的输入中收到的国家/地区每个员工每年(1996,1997,1998)的收入总额。
当我说他们的收入总额时,我指的是将所有订单的单价加起来。 (我使用了字段:table [订单详情] 的单价、数量和折扣)
在这里我向你们展示了我所做的查询,这样你们可以更好地了解我正在尝试做什么,我的问题是我不知道在哪里放置国家名称的条件(正如我所说的我们只需要根据我们在函数中插入的国家/地区显示信息):
CREATE FUNCTION fn_listAnualAmounts(@country NVARCHAR)
RETURNS TABLE
AS
BEGIN
DECLARE @anio96 MONEY, @anio97 MONEY, @anio98 MONEY
SET @anio96 = (SELECT SUM((od.UnitPrice - od.Discount)*od.quantity) as [Año 1996]
FROM [Order Details] od
left join Orders o on o.OrderID = od.OrderID
left join Employees e on e.EmployeeID = o.EmployeeID
GROUP BY YEAR(o.OrderDate),e.EmployeeID
HAVING YEAR(o.OrderDate) = '1996')
SET @anio97 = (SELECT SUM((od.UnitPrice - od.Discount)*od.quantity) as [Año 1997]
FROM [Order Details] od
left join Orders o on o.OrderID = od.OrderID
left join Employees e on e.EmployeeID = o.EmployeeID
GROUP BY YEAR(o.OrderDate),e.EmployeeID
HAVING YEAR(o.OrderDate) = '1997')
SET @anio98 = (SELECT SUM((od.UnitPrice - od.Discount)*od.quantity) as [Año 1998]
FROM [Order Details] od
left join Orders o on o.OrderID = od.OrderID
left join Employees e on e.EmployeeID = o.EmployeeID
GROUP BY YEAR(o.OrderDate),e.EmployeeID
HAVING YEAR(o.OrderDate) = '1998')
RETURN (SELECT e.LastName, @anio96, @anio97, @anio98
FROM Employees e)
END
GO
这里是northwind的数据库图
非常感谢大家!
只使用条件聚合:
SELECT e.LastName,
SUM(CASE WHEN YEAR(o.OrderDate) = 1996
THEN (od.UnitPrice - od.Discount)*od.quantity
END) as total_1996
SUM(CASE WHEN YEAR(o.OrderDate) = 1997
THEN (od.UnitPrice - od.Discount)*od.quantity
END) as total_1997,
SUM(CASE WHEN YEAR(o.OrderDate) = 1998
THEN (od.UnitPrice - od.Discount)*od.quantity
END) as total_1998
FROM [Order Details] od LEFT JOIN
Orders o
ON o.OrderID = od.OrderID LEFT JOIN
Employees e
ON e.EmployeeID = o.EmployeeID
GROUP BY e.EmployeeId, e.LastName;
在开始之前,我想让你知道我使用的是微软著名的northwind数据库。
所以,我需要创建一个函数来检索以下结果集:
查询需要创建一个接收国家名称(table 订单的 shipCountry 字段)作为参数的函数,它必须输出员工的姓氏([=32 的 lastName 字段) =] Employees) 以及在函数的输入中收到的国家/地区每个员工每年(1996,1997,1998)的收入总额。
当我说他们的收入总额时,我指的是将所有订单的单价加起来。 (我使用了字段:table [订单详情] 的单价、数量和折扣)
在这里我向你们展示了我所做的查询,这样你们可以更好地了解我正在尝试做什么,我的问题是我不知道在哪里放置国家名称的条件(正如我所说的我们只需要根据我们在函数中插入的国家/地区显示信息):
CREATE FUNCTION fn_listAnualAmounts(@country NVARCHAR)
RETURNS TABLE
AS
BEGIN
DECLARE @anio96 MONEY, @anio97 MONEY, @anio98 MONEY
SET @anio96 = (SELECT SUM((od.UnitPrice - od.Discount)*od.quantity) as [Año 1996]
FROM [Order Details] od
left join Orders o on o.OrderID = od.OrderID
left join Employees e on e.EmployeeID = o.EmployeeID
GROUP BY YEAR(o.OrderDate),e.EmployeeID
HAVING YEAR(o.OrderDate) = '1996')
SET @anio97 = (SELECT SUM((od.UnitPrice - od.Discount)*od.quantity) as [Año 1997]
FROM [Order Details] od
left join Orders o on o.OrderID = od.OrderID
left join Employees e on e.EmployeeID = o.EmployeeID
GROUP BY YEAR(o.OrderDate),e.EmployeeID
HAVING YEAR(o.OrderDate) = '1997')
SET @anio98 = (SELECT SUM((od.UnitPrice - od.Discount)*od.quantity) as [Año 1998]
FROM [Order Details] od
left join Orders o on o.OrderID = od.OrderID
left join Employees e on e.EmployeeID = o.EmployeeID
GROUP BY YEAR(o.OrderDate),e.EmployeeID
HAVING YEAR(o.OrderDate) = '1998')
RETURN (SELECT e.LastName, @anio96, @anio97, @anio98
FROM Employees e)
END
GO
这里是northwind的数据库图
非常感谢大家!
只使用条件聚合:
SELECT e.LastName,
SUM(CASE WHEN YEAR(o.OrderDate) = 1996
THEN (od.UnitPrice - od.Discount)*od.quantity
END) as total_1996
SUM(CASE WHEN YEAR(o.OrderDate) = 1997
THEN (od.UnitPrice - od.Discount)*od.quantity
END) as total_1997,
SUM(CASE WHEN YEAR(o.OrderDate) = 1998
THEN (od.UnitPrice - od.Discount)*od.quantity
END) as total_1998
FROM [Order Details] od LEFT JOIN
Orders o
ON o.OrderID = od.OrderID LEFT JOIN
Employees e
ON e.EmployeeID = o.EmployeeID
GROUP BY e.EmployeeId, e.LastName;