相关子查询的内部查询中的group by出错

时间:2017-07-24 16:31:57

标签: sql sql-server sql-server-2012 group-by correlated-subquery

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

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仅显示一行(一分钟单价)。

我哪里错了? 在此先感谢大家的帮助。

3 个答案:

答案 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