我编写了以下查询,返回输出时没有任何错误消息但是我看到输出有问题:
select productid, productname, categoryid, unitprice
FROM production.products as PP
where unitprice in (select min(unitprice) as minprice
from production.products as PC
group by categoryid)
order by categoryid
go
结果:
24 Product QOGNU 1 4.50
3 Product IMEHJ 2 10.00
19 Product XKXDO 3 9.20
21 Product VJZZH 3 10.00
33 Product ASTMN 4 2.50
52 Product QSRXF 5 7.00
54 Product QAQRL 6 7.45
74 Product BKAZJ 7 10.00
13 Product POXFU 8 6.00
输出显示categoryid = 3的多行。当我们按categoryid分组时,不应该每个categoryid仅显示一行(一分钟单价)。
我哪里错了? 在此先感谢大家的帮助。
答案 0 :(得分:1)
您的查询不相关。你似乎打算:
select productid, productname, categoryid, unitprice
FROM production.products p
where p.unitprice = (select min(p2.unitprice) as minprice
from production.products p2
where p2.categoryid = p.categoryid
)
order by p.categoryid;
group by
不是相关的子查询。 <{1}}(好的,有时候where
也是必需的。
您的特定查询存在逻辑问题。它得到任何价格是任何类别的最低价格的产品 - 甚至不是它自己的。
我会把它写成:
on
注意:如果多个产品都具有相同的最低价格,则返回所有产品。如果您特别需要,请使用select p.productid, p.productname, p.categoryid, p.unitprice
from (select p.*,
min(p.price) over (partition by p.categoryid) as minprice
from production.products p
) p
where p.price = p.minprice
order by p.categoryid;
:
row_number()
答案 1 :(得分:0)
您当前查询的问题在于,最低价格的子查询实际上是从所有类别中获取的所有最低价格的池。但您确实希望将查询限制为每个相应类别的最低价格。一种方法是改为加入子查询,以你想要的方式限制结果集。
SELECT
PP.productid,
PP.productname,
PP.categoryid,
PP.unitprice
FROM production.products AS PP
INNER JOIN
(
SELECT categoryid, MIN(unitprice) AS minprice
FROM production.products
GROUP BY categoryid
) t
ON PP.categoryid = t.categoryid AND
PP.unitprice = t.minprice
ORDER BY categoryid
答案 2 :(得分:0)
您想获得每个类别的最低单价吗?
SELECT * FROM (
SELECT productid, productname, categoryid, unitprice,ROW_NUMBER()OVER(PARTITION BY categoryid ORDER BY unitprice) AS ln
FROM production.products as PP
) AS t WHERE t.ln=1
order by categoryid