SQL 比较汇总平均值 (Northwind)

SQL compare aggregated averages (Northwind)

我的问题特别针对 Northwind 数据库,因此我没有提供任何可复制的 example/data 集。

我想 select 所有单价大于每个类别平均单价的产品,给定产品所属的类别除外。我尝试了两种不同的方法,none 目前为止取得了预期的结果。

这个 returns 一个聚合数据集,但我不知道如何(我猜是使用 having by?)将每个单价与所有类别的平均单价进行比较,给定产品所属的类别除外至

select 
p.ProductName, 
UnitPrice, t.mean, t.CategoryID from Products as p
inner join
(select avg(UnitPrice) as mean, CategoryID from Products
group by CategoryID) as t
on p.CategoryID = t.CategoryID

在这里我可以将单价与所有类别的总平均值进行比较,不排除给定产品所属的类别

SELECT x.ProductName, AVG(x.UnitPrice) AS average
FROM Products x
GROUP BY x.CategoryID, x.ProductName
Having AVG(x.UnitPrice)> 
(select AVG(UnitPrice) from Products)

期望的结果应该如下所示

谢谢。

你可以用横向连接来表达这个:

select p.*, a.avg_unitprice
from products p
cross apply (
    select avg(p1.unitprice) avg_unitprice
    from products p1
    where p1.categoryid <> p.categoryid
) a
where p.unitprice > a.avg_unitprice 

这会将每个产品的单价与其他类别中所有产品的平均单价进行比较。

另一方面,如果您想要价格高于其他类别所有平均值的产品,那么 not exists 似乎更合适:

select p.*
from products p
where not exists (
    select 1
    from products p1
    where p1.categoryid <> p.categoryid
    group by p1.categoryid
    having avg(p1.unitprice) >= p.unitprice
)