我编写了以下查询,该查询返回输出没有任何错误消息,但是我看到输出存在问题:
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
输出显示类别 id = 3 的多行。当我们按类别 ID 分组时,它不应该为每个类别 ID 只显示一行(一分钟单价(吗?
我哪里出错了? 提前感谢大家的帮助。
您的查询不相关。 你似乎打算:
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
不是相关的子查询。 需要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()
:
select p.productid, p.productname, p.categoryid, p.unitprice
from (select p.*,
row_number() over (partition by p.categoryid order by p.price asc) as seqnum
from production.products p
) p
where seqnum = 1
order by p.categoryid;
当前查询的问题在于,最低价格的子查询实际上是从每个类别中获取的所有最低价格的池。 但是,您确实希望将查询限制为每个相应类别的最低价格。 一种方法是改为联接到子查询,以所需的方式限制结果集。
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
是否要获取每个类别的最低单价?
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