【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 ) ) |
我告诉你这也不会运行。如果你想交你的家庭作业的话,你就要自己决定它是不是正确。最好的方法就是进行测试。