2012-04-24 34 views
0

有一個Select聲明交替可能性加入

Select i.ItemID, s.Price, s.Qty, s.Company From Item i 
    Inner Join Sku s ON s.ItemID = i.ItemID 

它返回這樣的:

ItemID | Price | Qty | Company 
    1 | $50.00 | 0 | Abc inc. 
    1 | $45.00 | 5 | Def inc. 
    1 | $35.00 | 15 | Xyz inc. 

    2 | $36.00 | 4 | Abc inc. 
    2 | $45.00 | 5 | Def inc. 
    2 | $35.00 | 1 | Xyz inc. 

    3 | $20.00 | 2 | Abc inc. 
    3 | $45.00 | 0 | Def inc. 
    3 | $35.00 | 5 | Xyz inc. 

但需要有以下邏輯:

顯示用最低的價格行並且Qty> 0,包括轉交給該結果的公司。

否則......

顯示用最低的價格,其中包括指公司於價格的行。

這將是這個樣子:

ItemID | Price | Qty | Company 
    1 | $35.00 | 15 | Xyz inc. 

    2 | $35.00 | 1 | Xyz inc. 

    3 | $20.00 | 2 | Abc inc. 

我還沒有嘗試過任何東西,因爲我真的不知道什麼嘗試或什麼,甚至在我的問題問。有什麼建議麼?

回答

1

下面是做到這一點的一種方法:

SELECT  I.ItemId 
     , S.Price 
     , S.Qty 
     , S.Company 
FROM  dbo.Item I 
CROSS APPLY (
       SELECT MIN(Price) Price 
       FROM dbo.Sku  MP 
       WHERE I.ItemId = MP.ItemId 
       AND  Qty   > 0 
      ) MP 
CROSS APPLY (
       SELECT 
       TOP 1 Price 
        , Qty 
        , Company 
       FROM dbo.Sku  S 
       WHERE S.ItemId = I.ItemId 
       AND  S.Price  = MP.Price 
      ) S 
+0

這是似乎爲我工作的唯一方法..謝謝。 – 2012-04-24 14:24:50

0
Select i.ItemID, Min(s.Price) as Price, s.Qty, s.Company 
From Item i Inner Join Sku s ON s.ItemID = i.ItemID 
Where s.qty > 0 
Group by i.itemid, s.qty, s.Company 
+0

如果它們都具有相同的價格會怎樣?我想退回其中的任何一個。 – 2012-04-24 05:36:18

0

下面是該查詢,

Select i.ItemID, s.Price, s.Qty, s.Company 
From Item i 
Inner Join Sku s 
    ON s.ItemID = i.ItemID 
Inner Join (
    select min(price) as Price, ItemID 
    from Sku 
    where Qty > 0 
    group by ItemId 
)a 
on a.ItemId = s.ItemId 
and a.Price = s.Price 

如果從項目表只需要項目Id,你可以刪除與項目表中加入自己作爲項目Id存在於SKU。

+0

如果他們都有相同的價格?我想退回其中的任何一個。 – 2012-04-24 05:35:53

0
Select i.ItemID, min(s.Price) as price, s.Qty, s.Company From Item i 
Inner Join Sku s ON s.ItemID = i.ItemID and s.qty>0 
group by i.itemid, s.company, s.qty 
+0

如果他們都有相同的價格?我想退回其中的任何一個。 – 2012-04-24 05:36:11

1

如何這樣的事情,用行號:

select 
    i.ItemId, s.Price, s.Qty, s.Company 
from 
    item i 
inner join 
    (
     select 
      t.ItemId, 
      t.Price, 
      t.Qty, 
      t.Company, 
      RowNumber = row_number() over (PARTITION BY t.ItemId order by t.price asc, t.qty desc) 
     from 
      Sku t 
    ) s on s.itemid = i.ItemId 
where 
    s.RowNumber = 1 

行號 「分區的」 和「ORDER BY 「在這裏很重要,以確保正確的結果,即使所有數量爲一個項目都爲0,這項工作。

+0

我已經做出了這樣的假設,如果一件物品的最低價格可能會返回多家公司,我們只返回第一個。 – 2012-04-24 06:19:05

+0

這不涉及返回特定於產品的行還是這樣做? – 2012-04-24 14:12:15

+0

我編輯了示例以顯示與項目表的連接。 – 2012-04-24 18:21:06

0

基本上,你想要th第一個sku記錄,首先判斷它是否有任何股票(股票首先出現的項目),然後是價格,上升。在以下查詢中,公用表表達式返回所需的SKU字段以及RowNum計算字段。 RowNum按ItemID進行分區(即爲每個新的ItemID重置爲1),並按股票首先出現,然後按價格排序。然後主查詢從每個ItemID中選擇第一條記錄:

WITH cte AS (
    SELECT ItemID, Price, Qty, company, 
    ROW_NUMBER() OVER (PARTITION BY ItemId ORDER BY 
     CASE WHEN Qty > 0 THEN 1 ELSE 0 END DESC, Price ASC) AS RowNum 
    FROM #sku 
    ) 
SELECT ItemID, price, qty, Company FROM cte WHERE RowNum = 1