【问题标题】:I am stuck on a sql query我被困在一个 sql 查询上
【发布时间】:2018-08-09 04:24:05
【问题描述】:

编写查询以列出不同的办公室(他们的地址)、该办公室的员工人数以及该办公室的员工作为销售代表的订单数量。

到目前为止,这是我在 mysql 中提出的:

SELECT Offices.addressLine1,
        Offices.addressLine2, 
        COUNT(Employees.employeeNumber),
        COUNT(Orders.orderNumber)
   FROM Offices,
        Employees,
        Customers,
        Orders
   WHERE Offices.officeCode=Employees.officeCode AND
          Employees.employeeNumber=Customers.salesRepEmployeeNumber AND
          Customers.customerNumber=Orders.customerNumber
   GROUP BY addressLine1;

http://www.richardtwatson.com/dm6e/images/general/ClassicModels.png

这也是我用作参考的数据模型的链接。我知道我的代码并不完全正确,但我不知道如何以一种有意义的方式将所有表连接在一起,所以任何帮助都将不胜感激,谢谢!

【问题讨论】:

  • 这个查询得到了什么输出。并尝试group by Offices.addressLine1, Offices.addressLine2;
  • 您通常按您选择的列进行分组,除了那些参数设置函数的列!

标签: mysql sql select join


【解决方案1】:

您可以如下实现:

SELECT o.officecode
    ,o.addressLine1
    ,o.addressLine2
    ,count(e.employeeNumber)
    ,SUM(CASE 
            WHEN o.orderNumber IS NOT NULL
                THEN 1
            ELSE 0
            END) AS TotalOrders
FROM Offices AS o
INNER JOIN Employees AS e ON o.officecode = e.officecode
LEFT JOIN Customers AS c ON c.salesRepEmployeeNumber = e.employeeNumber
INNER JOIN Orders AS o ON o.customerNumber = c.customerNumber
GROUP BY o.officecode
    ,o.addressLine1
    ,o.addressLine2;

【讨论】:

    【解决方案2】:

    你可以试试下面的

    SELECT 
    Offices.officeCode,
    Offices.addressLine1,
    Offices.addressLine2,
    COUNT(ISNULL(Employees.employeeNumber,0)) AS EmpCount,
    COUNT(ISNULL(Orders.OrderNumber,0)) AS NoOfOrders    
    FROM
    Offices
    INNER JOIN Employees
    ON Offices.officeCode = Employees.officeCode
    LEFT JOIN Customers
    ON Employees.employeeNumber = Customers.salesRepEmployeeNumber
    LEFT JOIN Orders
    ON Customers.customerNumber = Orders.customerNumber
    GROUP BY 
    Offices.officeCode,
    Offices.addressLine1,
    Offices.addressLine2
    

    【讨论】:

      【解决方案3】:

      跨多个表进行聚合时,您可能会得到不正确的结果。在这里,您需要计算distinct 员工,否则该计数将被订单数量夸大。请注意,count 函数会忽略 NULL,因此无需补偿 NULL,但您确实需要对 customere/orders 进行左连接以确保计算所有员工。

      SELECT
            o.officecode
          , o.addressLine1
          , o.addressLine2
          , count(distinct e.employeeNumber)
          , count(o.orderNumber) AS TotalOrders
      FROM Offices AS o
      INNER JOIN Employees AS e ON o.officecode = e.officecode
      LEFT JOIN Customers AS c ON c.salesRepEmployeeNumber = e.employeeNumber
      LEFT JOIN Orders AS o ON o.customerNumber = c.customerNumber
      GROUP BY
            o.officecode
          , o.addressLine1
          , o.addressLine2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多