我通常可以找出我的应用程序所需的任何sql查询,但最近我被我需要创建的Cross Tab查询所困扰,并且想知道你是否可以提供帮助?
我有3张桌子
Category(catID, catTitle)
Equipment(equipID, make, model, quantity, catID, siteID)
Site(siteID, title)
我想创建一个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
显示的数字表示每个站点中每个类别项目的总和,使用数量字段和设备表。我以前从未做过Cross Tab查询,而且我正在努力让这个工作起作用。
答案 0 :(得分: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] as site1,[2] as site2 .. “你需要的东西。
答案 1 :(得分:2)
我认为你错过了一个在你的网站和设备之间作出参考的表格
类似的东西:
EquipmentSite(SiteID, EquipID)
因为现在不可能将该网站称为设备
编辑:
由于siteID也在设备中,我会建议另一个表,你的数据库的一个小重构(因为我真的不知道怎么做)
如果您获得大量数据,那么每次要访问这些数据时,获取数据并计算每件事情都会很麻烦。
所以我建议这个表
siteCatCount(CatID, siteID, cnt)
因此,当您修改数据(添加或删除设备)时,您将更新此表,它会更清晰,您不必每次都计算每台设备的数量