购买项目

问题描述:

非规范化的数据我有如下表:购买项目

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

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