我有两张桌子
和第三个表格,显示商店中物品的可用性以及该商店中物品的成本。
Shop_Item_Mapping。
Item的一些示例数据为(1, Candy
),其中1为id,Candy为Item的名称。
(2 , Chocolate)
(3 , Chair)
(4 , Mobile)
(5 , Bulb)
Shop表的一些示例数据将是
(1 , Address Of Shop)
(2 , Address Of Shop)
(3 , Address of the shop)
现在,我的映射表显示了哪个商品在哪个商店可用以及成本是多少。
Shop_Item_Mapping ( Shop_id , Item_Id , Cost of Item).
所以我的映射表有这些条目
SID , IID , Cost
(1 , 1, 5)
(1 , 2 ,10)
(1 ,4 ,2300)
(2 ,3 ,50)
(2 , 5 ,10)
(3 , 1 , 4)
(3 , 2 , 5 )
(3 , 4 , 2500 )
(3 , 5 , 12 )
现在我有一个查询,我想要所有那些同时拥有Mobile(id = 4)和Chocolates(id = 2)并且移动价格 我正在尝试查看我将拥有此类数据的位置
Shop_ID,I1,I2,I3,I4,I5其中I1,I2,I3,I4,I5是项目的ID,这些项目的价值将是该商店中商品的成本。
所以我的观点是 当我的物品少了时,我能够这样做。但如果我的存储库中有超过15000个项目,我可以使用这么多列创建一个视图吗?(1 , 5 , 10 , NULL , 2300 , NULL )
(2 , NULL , NULL , 50 , NULL , 10)
(3 , 4 , 5 , NULL , 2500 , 12 ).
答案 0 :(得分:2)
真的?视图中有14,000列?你这里有一个严重的设计问题。但是,如果您想要去,请尝试此动态数据透视查询。它适用于您提供的有限数据:
DECLARE @ColumnList VARCHAR (MAX)
DECLARE @SQL VARCHAR(MAX)
-- Create a list of distinct Item IDs which will become column headers
SELECT @ColumnList = COALESCE(@ColumnList + ', ','') + 'ItemID' + CAST(I.ItemID AS VARCHAR(12)) FROM (SELECT DISTINCT ItemID FROM Item) I
SET @SQL = '
SELECT
ShopID, ' + @ColumnList + '
FROM
(
SELECT
s.ShopID,
ItemID = ''ItemID'' + Cast(i.ItemID as varchar(12)),
sim.ItemCost
FROM
dbo.Shop_Item_Mapping AS sim
JOIN dbo.Shop AS s ON sim.ShopID = s.ShopID
JOIN dbo.Item AS i ON SIM.ItemID = i.ItemID
) T
PIVOT
(
MIN(ItemCost)
FOR T.ItemID IN (' + @ColumnList + ')
) AS PVT'
exec (@SQL)
根据更新的问题编辑字段名称。