【问题标题】:Sql Server 2008 Cross Tab QuerySql Server 2008 跨表查询
【发布时间】:2011-12-18 21:43:59
【问题描述】:

我通常可以找出我的应用程序需要的任何 sql 查询,但最近我被需要创建的交叉表查询难住了,想知道您是否可以提供帮助?

我有 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

使用设备表中的数量字段显示的数字代表每个站点内每个类别项目的总数。我以前从来没有做过交叉表查询,我正在努力让它工作。

【问题讨论】:

    标签: sql sql-server-2008 crosstab


    【解决方案1】:

    您应该可以使用 '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.. ." 你需要的东西。

    【讨论】:

    • 这是超级雷。非常感谢您的帮助。
    【解决方案2】:

    我认为您缺少在您的站点和设备之间进行参考的表格

    类似的东西:

    EquipmentSite(SiteID, EquipID)
    

    因为现在无法分辨哪个站点是哪个设备

    编辑:

    由于siteID也在设备中,我会建议另一个表,对你的数据库进行一点重构(因为我真的不知道该怎么做)

    如果您获得大量数据,那么每次您想要访问这些数据时,获取数据并计算每一件事会很麻烦。

    所以我建议这张桌子

    siteCatCount(CatID, siteID, cnt)
    

    所以当你修改数据(添加或删除设备)时,你会去更新这个表,它会更清晰,你不必每次都计算每台设备的数量

    【讨论】:

    • 我很抱歉。那是一个错字,设备表也有一个 siteID 字段。
    • 是的,即使使用 siteID 也是一团糟 :)
    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多