【问题标题】:TSQL equivalent of an MS Access Crosstab queryTSQL 等效于 MS Access 交叉表查询
【发布时间】:2009-04-29 14:30:33
【问题描述】:

什么是 TSQL 中的 MS-Access 交叉表查询的等价物?还有更好的方法吗?

我有一个这样组织的数据:

Fish
ID   Name
---- ---------
1    Jack
2    Trout
3    Bass
4    Cat

FishProperty
ID   FishID Property Value
---- ------ -------- -----
1    1      Length   10
2    1      Girth    6
3    1      Weight   4
4    2      Length   6
5    2      Weight   2
6    3      Girth    12

我有很多用户需要对数据进行报告,而且(显然)如果他们能看到这样的数据会更容易:

Fish
ID   Name      Length Girth Weight
---- --------- ------ ----- ------
1    Jack      10     6     4
2    Trout     6            2
3    Bass             12

我的计划是创建一个类似交叉表的视图,让他们可以直接报告。

【问题讨论】:

    标签: sql sql-server tsql ms-access


    【解决方案1】:

    你在找PIVOT吗?

    编辑:您可能需要进入第二页才能看到 PIVOT 语法的用法。

    编辑 2:另一个example

    示例

    SELECT SalesPerson, [Oranges] AS Oranges, [Pickles] AS Pickles
    FROM
    (SELECT SalesPerson, Product, SalesAmount
    FROM ProductSales ) ps
    PIVOT
    (
    SUM (SalesAmount)
    FOR Product IN
    ( [Oranges], [Pickles])
    ) AS pvt
    

    编辑 3 CodeSlave,查看blog entry 了解有关动态数据透视查询的更多信息。

    【讨论】:

    • 如果我不提前知道这些属性是橘子和泡菜(不过我可能有一个可用属性列表)。我可以执行“选择 *”之类的操作吗?
    • Codeslave,检查最新编辑的博客条目,其中包含动态透视。
    【解决方案2】:

    作为 PIVOT 查询的替代方法,您可以创建如下视图:

    create view dbo.myview
    as
    select 
        fish.ID
    ,   fish.Name
    ,   len.Value as Length
    ,   gir.Value as Girth
    ,   wei.Value as Weight
    from fish
    left join fishproperty len 
        on len.fishid = fish.id 
        and len.property = 'Length'
    left join fishproperty gir 
        on gir.fishid = fish.id 
        and gir.property = 'Girth'
    left join fishproperty wei 
        on wei.fishid = fish.id 
        and wei.property = 'Weight'
    

    如果您不提前知道列,我能想到的唯一解决方案是动态生成查询并使用“exec sp_executesql”来运行它。例如:

    declare @query nvarchar(4000)
    set @query = 'select ... from fish'
    -- For each column
    set @query = @query + ' left join fishproperty ' +
        propname + ' on ' + propname + '.fishid = fish.id ' +
        'and ' + propname + '.property = ''' + propname + ''' '
    exec sp_executesql @query
    

    警告:动态查询可能是一个令人头疼的维护问题。

    【讨论】:

      【解决方案3】:

      这是这个问题的重复:Help needed with Dynamic Pivoting in SQL2005 是的,可以使用动态 sql,通过一些技巧,您甚至可以对返回的结果进行选择或为其创建视图,但如果您表有超过 1000 条记录,我不推荐这种方法,因为性能会很差。

      【讨论】:

        【解决方案4】:

        您也可以使用CASE 语句,但您的报告工具应该能够使用矩阵/数据透视表/交叉表模板为您(动态!)执行此操作。

        【讨论】:

          猜你喜欢
          • 2010-11-11
          • 1970-01-01
          • 1970-01-01
          • 2015-12-28
          • 2013-07-14
          • 1970-01-01
          • 2022-01-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多