在相关子查询的内部查询中分组依据错误



我编写了以下查询,该查询返回输出没有任何错误消息,但是我看到输出存在问题:

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

相关内容

  • 没有找到相关文章

最新更新