TSQL等效的MS Access Crosstab查询

时间:2009-04-29 14:30:34

标签: sql sql-server tsql ms-access

在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 个答案:

答案 0 :(得分:9)

您在寻找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以获取有关动态数据透视查询的更多信息。

答案 1 :(得分:0)

作为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

警告:动态查询可能是一个维护问题。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您也可以使用CASE语句,但您的报告工具应该可以使用矩阵/ pivot / crosstab模板为您(动态!)执行此操作。