分组聚合的SQL选择标准

时间:2009-01-20 14:59:49

标签: sql mysql

我正在尝试为以下两个问题找到一个简单的MySQL语句:

我有4个表:员工,客户,订单,产品(订单中的每个条目都包含日期,参考产品,数量和对客户的引用,以及对员工的引用)。

现在我试图让所有客户的销售量(数量* product.price)在1996年比1995年更大。

并且:我想列出销售量低于平均销售量的所有员工。

真的很感激任何帮助。我已经设法使用php脚本获取信息,但我认为这可以通过一些聪明的SQL语句来完成。

有人能帮助我吗?


员工表:ID#Name

产品表:ID#NAME#PRICE

订单表:ODERID#CUSTOMERID#DATE #EMPLOYEE#PRODUCTID #QUANTITY

3 个答案:

答案 0 :(得分:3)

对于第一部分(假设相当多的架构):

SELECT Customers.ID
FROM Customers 
    LEFT JOIN orders AS o1 ON o1.CustomerID=Customers.ID AND YEAR(o1.DATE) = 1995
    LEFT JOIN products AS p1 ON p1.id = o1.productID
    LEFT JOIN orders AS o2 ON o2.CustomerID=Customers.ID AND YEAR(o2.DATE) = 1996
    LEFT JOIN products AS p2 ON p2.id = o2.productID
HAVING SUM(o1.quantity* p1.price) < SUM(o2.quantity*p2.price)

答案 1 :(得分:2)

我不知道你正在使用的数据库类型,所以我将使用sqlserver。 'Year'功能在大多数数据库中都可用,因此您应该能够重写有问题的数据库的查询。

我认为这是一个查询,它返回1996年总数比1995年高的客户的所有客户ID +总数,但我还没有测试过。 Crucial是HAVING子句,您可以根据分组结果指定WHERE类型的子句。

SELECT  o.CustomerId, SUM(o.Quantity * p.Price) AS Total
FROM    Orders o INNER JOIN Products p
        ON o.ProductId = p.ProductId
WHERE   YEAR(o.Date) == 1996
GROUP BY o.CustomerId
HAVING SUM(o.Quantity * p.Price) > 
(
    SELECT  SUM(o.Quantity * p2.Price) AS Total
    FROM    Orders o2 INNER JOIN Products p2
            ON o2.ProductId = p.ProductId
    WHERE   YEAR(o.Date) == 1995
            AND o2.CustomerId = o.CustomerId
    GROUP BY o.CustomerId
)

答案 2 :(得分:0)

类似的东西:

  1. 从客户c中选择* 其中(从订单o中选择sum(o.quantity * p.price),产品p,其中o.productID = p.productID和o.dateyear = 1996,o.customerID = c.customerID)&lt; (从订单o,产品p中选择总和(o.quantity * p.price),其中o.productID = p.productID和o.dateyear = 1995和o.customerID = c.customerID)

  2. 从员工e中选择*(从订单o中选择avg(o.quantity * p.price),产品p,其中o.productID = p.productID和o.empID = e.EmpID)&lt; (从订单o中选择avg(o.quantity * p.price),产品p,其中o.productID = p.productID)