【问题标题】:SQL Server - creating a function using the northwind databaseSQL Server - 使用 Northwind 数据库创建函数
【发布时间】:2018-02-20 23:33:52
【问题描述】:

在开始之前,我想让你知道我使用的是微软著名的 Northwind 数据库。

所以,我需要创建一个函数来检索以下结果集:

Query需要创建一个函数,接收一个国家名称(Orders表的shipCountry字段)作为参数,它必须输出员工的姓氏(Employees表的lastName字段)和总金额在函数输入中收到的国家/地区每位员工每年(1996、1997、1998)的收入。

当我谈到他们的收入总额时,我指的是总结所有订单的单价。 (我使用了表格[订单详情]的unitPrice,数量和折扣字段)

在这里,我向你们展示了我所做的查询,以便你们更好地了解我想要做什么,我的问题是我不知道在哪里放置国家名称的条件(正如我所说,我们只是必须根据我们在函数中插入的国家/地区显示信息):

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的数据库图

非常感谢大家!

【问题讨论】:

  • 阅读MSDN 了解如何创建函数。我认为您的功能无效。

标签: sql sql-server sql-function northwind


【解决方案1】:

只使用条件聚合:

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;

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2013-12-09
    • 2018-06-08
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多