如何创建一个包含14000列的视图?

时间:2014-11-05 02:08:58

标签: sql sql-server database sql-server-2008

我有两张桌子

  1. 商店
  2. 项。
  3. 和第三个表格,显示商店中物品的可用性以及该商店中物品的成本。

    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,这些项目的价值将是该商店中商品的成本。 所以我的观点是

    (1 , 5 , 10 , NULL , 2300 , NULL ) 
    (2 , NULL , NULL , 50 , NULL , 10)
    (3 , 4 , 5 , NULL , 2500 , 12 ).
    

    当我的物品少了时,我能够这样做。但如果我的存储库中有超过15000个项目,我可以使用这么多列创建一个视图吗?

1 个答案:

答案 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)

根据更新的问题编辑字段名称。