2011-10-31 83 views
5

我通常可以找出我需要的任何SQL查询,但我最近被我需要创建的交叉表查询难倒,并且想知道您是否可以提供帮助?Sql Server 2008交叉表查询

我有3个表

Category(catID, catTitle) 
Equipment(equipID, make, model, quantity, catID, siteID) 
Site(siteID, title) 

而且我想建立一个交叉表查询以显示设置象的结果下面

Category Site1 Site2 Site3 Site4 Site5 
PC   2  0  10  3  6 
Camera  12  4  2  0  8 
Printer  3  2  1  1  2 

显示的数字表示内总共每个类别项目的每个站点使用设备表中的数量字段。我从来没有必须做一个交叉表查询之前,我很努力得到这个工作。

回答

7

你应该可以用'pivot'操作符来做到这一点。像这样的东西(虽然我相信我一艘被失去了一些拼写或语法的详细信息...):

select catTitle, [1] as site1, [2] as site2, [3] as site3, [4] as site4, [5] as site5 
    from (select category.catTitle, equipment.quantity, site.title 
      from equipment 
      inner join site 
       on (equipment.siteid = site.siteid) 
      inner join category 
       on (category.catid = equipment.catid) 
     ) 
    pivot 
    (
    sum (quantity) 
    for equipment.siteid in ([1], [2], [3], [4], [5]) 
) as pvt 
order by pvt.category; 

这里的问题是,你需要知道你要在查询中包含网站ID的确切集合。如果您需要更动态的交叉表(就像您可以在Excel中获得的那样),那么您需要将查询文本生成为字符串并使用sp_executesql来运行它。在生成的文本中,您包含尽可能多的“[1],[2],[3],[4],[5] ...”和“[1]”作为site1,[2]作为site2。 “你需要的东西。

+0

这是超级雷。非常感谢你的帮助。 – tgriffiths

2

我觉得你缺少一个表,让

喜欢的东西,你的网站和设备之间的引用:

EquipmentSite(SiteID, EquipID) 

因为现在这是不可能告诉至极站点至极设备

编辑:

由于siteID也在设备中,我会提出另一张表,对您的数据库进行一些重构(因为我真的不知道如何做到这一点)

如果你得到了大量的数据,那么每次访问这些数据时都会抓取数据并计算每件事情。

所以我提出这个表

siteCatCount(CatID, siteID, cnt) 

所以,当你修改你的数据(添加或删除设备),你会去更新这个表,这将是更清晰,你不会有计算的每一个计数设备每次

+0

我的歉意。这是一个错字,设备表也有一个siteID字段。 – tgriffiths

+0

是的,即使与siteID它是一个混乱:) – GregM