技术开发 频道

针对客户订单问题的SQL解决方案

  【IT168 技术文档】

  问:
我如何在统计总数或首行后选择最大值?

 


Select Customer. *, SUM(Quantity) as Total 
    from Customer, Orders o1
    where customer.cust_ID = o1.cust_ID 
    and quantity IN 
    (Select Quantity from orders o2 
    where o1.cust_ID = o2.cust_ID) 
    group by customer.cust_ID, cust_name, Region, Phone 
    order by Total desc;

  行数=1的函数不适合我。

  答:这是一个很经典的问题:“找出订单最多的客户并计算出总的订单数量。”

  你尝试的解决方案有一些问题。GROUP BY只有在客户表仅仅包含那些列的情况下才能运行。这也就是用 "select star"的直接结果,即所有的列。用了这个符号,所有的列都不能聚集,他们必须在GROUP BY字句中出现,否则你就会出现句法错误。(除非你用的是MySQL。在MySQL中可能会正确运行。详细请查看《揭秘GROUP BY》,注意这篇文章属于高级级别类。)

  避免这个问题的一种方法就是在子查询中“下拉”集合,所以在外部查询中没有GROUP BY子句,并且你还可以使用"select star"。

  你的"quantity IN (correlated subquery)"这一条件没有任何意义。实际上,它只表示所有和这个客户的订单数量相等的一些订单。你只需要忽略它,因为每个客户订单数量也就是你要找的客户订单数量。而你要找的是所有客户订单的数量,然后选择整个数量中最大的那些和它所属的客户。

  最后,"行数= 1" 这个函数才会起作用,但是每个数据库系统的不同决定它使用的不同的句法。可能是TOP或者LIMIT,,或者FETCH FIRST等等(如果你采用这种方法的话,你可以查询SQL参考手册)。

  有没有其他的解决方案?有。

 

SELECT Customer.cust_ID  
         , Customer.cust_name
         , Customer.Region   
         , Customer.Phone    
         , o1.Total
      FROM Customer
    INNER
      JOIN ( SELECT cust_ID
                  , SUM(quantity) AS Total 
               FROM Orders
             GROUP
                 BY cust_ID ) AS o1
        ON o1.cust_ID = Customer.cust_ID
     WHERE o1.Total = 
           ( SELECT MAX(Total) FROM 
           ( SELECT cust_ID
                  , SUM(quantity) AS Total 
               FROM Orders
             GROUP
                 BY cust_ID ) AS o2 ) )

  我告诉你这也不会运行。如果你想交你的家庭作业的话,你就要自己决定它是不是正确。最好的方法就是进行测试。

0
相关文章