1

在此处输入图像描述

所以在这个数据库中,员工进行销售,每个员工都有一个经理。

我试图弄清楚如何按经理计算销售总额。

我发现了如何获得每个员工的销售额,但我不知道经理如何获得它。

SELECT Employee.Name, SUM(OrderItem.Quantity*OrderItem.Saleprice)
FROM (Employee INNER JOIN [Order] ON Employee.EID = Order.EID) INNER JOIN OrderItem ON      
Order.OrderID = OrderItem.OrderID
Group By Employee.Name;

我只需要由经理订购吗?或者有一个 where 子句只列出经理?

4

3 回答 3

1

假设只存在 1 级经理到员工……它还假设经理没有需要添加的销售。

SELECT E2.Name, SUM(OrderItem.Quantity*OrderItem.Saleprice)
FROM Employee 
INNER JOIN [Order] ON Employee.EID = Order.EID
INNER JOIN OrderItem ON Order.OrderID = OrderItem.OrderID
INNER JOIN employee e2 on E2.EID = E2.ManagerID
Group By E2.Name;

这基本上再次加入员工表以获取经理。

如果我们需要在同一经理下包括经理销售和员工销售,我们将需要使用类似于如下的内部联接

INNER JOIN employee e2 on E2.EID = coalese(E2.ManagerID, E2.EID)

coalese 获取一组变量中的第一个非空值。在这种情况下,由于经理记录中的 managerID 字段为空,因此我们用 EID 代替经理 ID,从而也可以汇总他们的销售额。

然而,所有这一切再次取决于只有 1 级深度 w/ 经理和 ManagerID 为空的经理。

`

于 2013-05-06T00:55:59.487 回答
1

我认为您可以从现有查询开始,SELECTGROUP BY ManagerID不是Employee.Name. 我也会给表名起别名,特别是Order因为它是一个保留字。但是你不需要给它们起别名。

SELECT
    e.ManagerID,
    SUM(oi.Quantity*oi.Saleprice) AS sales
FROM
    (Employee AS e
    INNER JOIN [Order] AS o
    ON e.EID = o.EID)
    INNER JOIN OrderItem AS oi
    ON o.OrderID = oi.OrderID
Group By e.ManagerID;

那应该给你总数ManagerID。如果您需要经理的姓名,并且这些姓名存储在另一个表中,您也可以加入该表。

再次查看表格的屏幕截图,前 4 个ManagerID值为 Null。如果这些行中的人是经理,您可以加入该Employees表的第二个副本。

SELECT
    e2.Name,
    SUM(oi.Quantity*oi.Saleprice) AS sales
FROM
    ((Employee AS e
    INNER JOIN [Order] AS o
    ON e.EID = o.EID)
    INNER JOIN OrderItem AS oi
    ON o.OrderID = oi.OrderID)
    INNER JOIN Employee AS e2
    ON e2.EID = e.ManagerID
Group By e2.Name;
于 2013-05-06T01:15:53.690 回答
0

尝试

SELECT m.Name ManagerName, SUM(oi.Quantity * oi.Saleprice) Total
  FROM Employee e INNER JOIN 
       [Order] o ON e.EID = o.EID INNER JOIN 
       OrderItem oi ON o.OrderID = oi.OrderID INNER JOIN
       Employee m ON e.ManagerID = e.EID
 GROUP BY e.ManagerID, m.Name;
于 2013-05-06T00:53:01.413 回答