0

我寫下面的查詢是沒有任何錯誤消息但是我看到的問題與輸出返回輸出:錯誤與組由在相關子查詢內的查詢

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

您只在子查詢中分組。此外,您的'IN'與每個價格相比不是產品類別的價格。選中Tim回答,看看如何使用'JOIN' –

回答

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 
+0

謝謝大家。現在我知道我出錯了。你的回答非常有幫助! –

+0

@NikhilaBakurupanda標記正確嗎? –

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不相關子查詢作。 A 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; 
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