Sql Server 2008交叉表查询

tco*_*ode 5 sql crosstab sql-server-2008

我通常可以找出我的应用程序所需的任何SQL查询,但我最近被我需要创建的Cross Tab查询所困扰,并且想知道你是否可以提供帮助?

我有3张桌子

Category(catID, catTitle) 
Equipment(equipID, make, model, quantity, catID, siteID)
Site(siteID, title)
Run Code Online (Sandbox Code Playgroud)

我想创建一个Cross Tab查询来显示如下所示的结果集

Category   Site1   Site2   Site3   Site4   Site5
PC           2       0       10      3      6
Camera       12      4       2       0      8
Printer      3       2       1       1      2
Run Code Online (Sandbox Code Playgroud)

显示的数字表示每个站点中每个类别项目的总数,使用数量字段和设备表.我以前从未做过Cross Tab查询,而且我正在努力让这个工作.

Ray*_*Ray 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;
Run Code Online (Sandbox Code Playgroud)

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