代码之家  ›  专栏  ›  技术社区  ›  BIBD

TSQL相当于MS Access交叉表查询

  •  4
  • BIBD  · 技术社区  · 15 年前

    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
    

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

    4 回复  |  直到 15 年前
        1
  •  9
  •   TheTXI    15 年前

    你在找吗 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 有关动态透视查询的更多信息。

        2
  •  0
  •   Andomar    15 年前

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

    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
  •  0
  •   Community SushiHangover    7 年前

    这是这个问题的副本: Help needed with Dynamic Pivoting in SQL2005 是的,可以使用动态SQL,通过一些技巧,您甚至可以对返回的结果进行选择,或者为它创建一个视图,但是如果您的表有1000多条记录,我不建议使用这种方法,因为性能最好是很差的。

        4
  •  0
  •   Community SushiHangover    7 年前

    您也可以使用 CASE 语句,但您的报告工具应该能够为您执行此操作(动态!)使用Matrix/Pivot/Crosstab模板。