2012-07-19 106 views
0

非規範化的數據我有如下表:購買項目

BoughtItems 

UserID ItemID StoreID Quantity Price 
1  1  1  1   1 
1  4  1  2   3 
1  5  2  1   3 

假設,這將是爲BoughtItems表中的每個用戶再沒有其他五個項目。

我想有一些STOREID所有的客戶,並已購買的,在這種格式...爲STOREID = 1的所有項目的結果將是:

UserID Item1ID Item2ID Item3ID Item4ID Item5ID 
1  1  4  [empty] [empty] [empty] 
+2

是怎樣的商店表有關? – 2012-07-19 19:12:13

+0

另外,如果有人只買了三件物品,你想在結果中做什麼?您可以顯示樣本數據,期望的結果,以及這些結果是否僅從查詢中返回,或者您是否真的需要以這種方式冗餘地將此數據存儲在另一個表中(並解釋原因),而不是單詞問題? – 2012-07-19 19:13:49

+0

我想爲某個「StoreID」指定的結果表。 BoughtItems中的StoreID字段存儲表有關係 – seeker 2012-07-19 19:15:22

回答

2
DECLARE @StoreID INT; 

SET @StoreID = 1; 

;WITH x AS 
(
    SELECT UserID, ItemID, 
    rn = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY ItemID) 
    FROM dbo.BoughtItems 
    WHERE StoreID = @StoreID 
) 
SELECT UserID, 
    Item1ID = MAX(CASE WHEN rn = 1 THEN ItemID END), 
    Item2ID = MAX(CASE WHEN rn = 2 THEN ItemID END), 
    Item3ID = MAX(CASE WHEN rn = 3 THEN ItemID END), 
    Item4ID = MAX(CASE WHEN rn = 4 THEN ItemID END), 
    Item5ID = MAX(CASE WHEN rn = 5 THEN ItemID END) 
FROM x WHERE rn <= 5 
GROUP BY UserID; 
+0

謝謝,這個查詢工作。但正如我所看到的,最好是創建一個包含所有字段的表格。 – seeker 2012-07-19 19:33:32

+0

@seeker仍然不確定你是在談論一個表或查詢的結果。 2012-07-19 19:34:37

+0

好像尋求者正在尋找一個藉口來反規範化... – Randy 2012-07-19 19:37:35