1

我可能有一个非常简单的问题,但似乎我还找不到解决方案。基本上,我必须编写一个基于 Northwind DB 的 SQL-Server 函数。它必须:

将 2 个日期作为参数并显示,不重复这些Customer 的数据ID | Name | City | Address,对于那些他从至少一个 Employee购买的总金额大于该 Employee 在两个日期之间的平均销售额的客户。

所以主要步骤应该是:
1. 从每个Employee中检索 Customer 的总购买量。我知道如何从每家公司获得总采购量:

SELECT 
Customers.CompanyName,    SUM(UnitPrice*Quantity)
FROM Orders inner join [Order Details]
ON Orders.OrderID=[Order Details].OrderID INNER JOIN 
Customers ON Orders.CustomerID=Customers.CustomerID
GROUP BY Customers.CompanyName

但是我怎样才能从每个员工那里得到那些呢?

2.将此与该员工在给定日期之间的平均销售额进行对比。我可以得到每个员工的平均值:

SELECT FirstName+' '+LastName, AVG(UnitPrice*Quantity)
FROM Orders inner join [Order Details]
ON Orders.OrderID=[Order Details].OrderID
INNER JOIN Employees 
ON Orders.EmployeeID=Employees.EmployeeID
WHERE OrderDate BETWEEN @dt1 and @dt2
GROUP BY FirstName+' '+LastName

请注意,我只是粘贴查询部分,但在这里,员工应该依赖于第一个查询(可能这应该放在子查询中)

一切都应该放在一个函数中(不应该一分为二)。Northwind DB 图是:Northwind Diagram。请帮忙!

4

1 回答 1

2

希望我的逻辑是正确的:

create function x (@from datetime, @to datetime)
returns table
as
return (
    with cust as (
        select o.customerid, o.employeeid, sum(unitprice*quantity) as cust_purchase
        from orders o
        inner join [order details] d on o.orderid=d.orderid
        where o.orderdate between @from and @to
        group by o.customerid, o.employeeid
    ),
    emp as (
        select o.employeeid, avg(unitprice*quantity) as emp_sale
        from orders o
        inner join [order details] d on o.orderid=d.orderid
        where o.orderdate between @from and @to
        group by o.employeeid
    )
    select c.customerid, c.companyname, c.city, c.address
    from cust
    inner join emp on cust.employeeid = emp.employeeid
    and cust.cust_purchase > emp.emp_sale
    inner join customers c on cust.customerid = c.customerid
)
go

select * from x ('19980401', '19980430')
于 2014-04-25T08:16:13.680 回答