SQL查询 - 理解语法

3
我想按数量展示最畅销的产品。
Product Table
ProductID  ProductName
1          AA   
2          BB
3          CC
[Order Details] Table
OrderID ProductID  Quantity DateOfOrder
1       1            10    SomeDate   
2       1            100     ,,
3       2            15      ,, 
4       1            15      ,,   
5       2            20      ,, 
6       2            30      ,, 
7       1            100     ,,

Expected Output

Product By Quantity  AA

因为 sum(quantity)=225

我使用了:

select 'Product By Quantity' + ProductName 
from
Products 
where ProductID in
 (select 
       ProductID
  from 
       [Order Details] det 
  where Quantity=
                (
                  select max(SUM(Quantity)) 
                  from [Order Details] od
                  where
                  od.ProductID=det.ProductID
                )
  )  

我得到了错误:"无法在包含聚合或子查询的表达式上执行聚合函数" 请解释一下为什么这里的语法失败,以便我今后知道正确的语法并编写适当的查询。同时,请给我正确的查询语句。
谢谢大家提前。

编辑

我正在尝试以下查询:
SELECT 'Best Selling Product'+ProductName
FROM 
Products
WHERE ProductID =
 (
       SELECT ProductID
       FROM [Order Details]
       GROUP BY ProductID
       HAVING SUM(Quantity) = (
                               SELECT MAX(SQ)
                               FROM (
                                       SELECT SUM(Quantity) as SQ
                                       FROM [Order Details]
                                       GROUP BY ProductID
                                    ) AS OD))

错误信息已经说明了。您在另一个聚合函数内使用了一个聚合函数。 - Mark Baijens
你能展示一下你正在处理的数据和一些期望的输出吗?我认为你的问题在于你尝试做什么,而不是max(sum())的问题。 - Abe Miessler
错误确实是将 sum() 放在 max() 内部,而您对 Martijn 的回答没有意义。尝试给出一个例子,我们可以帮助您。 - egrunin
4个回答

5

我想这就是你想要达到的目的:

select top 1 p.product_name, sum(od.quantity) as total_quantity
    from products p
        inner join [order details] od
            on p.productid = od.productid
    group by p.productid, p.product_name
    order by total_quantity desc

product_name分组是不正确的。比如,我有一个超级爆破器(id=4)和一个超级爆破器(id=6),但后者却完全没有销售。 - Denis Valeev
@Denis:谢谢。我将productid添加到group by子句中,以涵盖这种可能性。 - Joe Stefanelli

0

试试这个:

select 'Product By Quantity' + ProductName  from Products p
join 
(
select top 1 sum(Quantity) sq, od.ProductId 
from [Order Details] od
group by od.ProductId 
order by 1 desc
) bsp on p.productid = bsp.ProductId

bsp代表畅销产品


0

试试这个:

SELECT      TOP 1
            SUM(o.Quantity)
            ,p.ProductName
FROM        [Order Details] AS o
INNER JOIN  [Products] AS p ON p.ProductID = o.ProductID
GROUP BY    p.ProductID
            ,p.ProductName
ORDER BY    SUM(o.Quantity) DESC

接近了,但还不太对。你是按照个别数量而不是总和排序。请参见我的答案 - Joe Stefanelli

0

看起来 select max(SUM(Quantity)) 是错误的。求和的最大值没有任何意义。你是不是想用 max(Quantity)?


任何产品的Sum(数量)的最大值 - Amit
@Amit - 在SQL中,sum是查询语句返回的某一列所有值的总和。 - JNK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接