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
)
我的问题特别针对 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
)