2009-04-29 58 views
4

什么是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 

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

回答

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的有关动态透视查询一些信息。

+0

如果我事先不知道属性是橙子和酱菜(我可能有一个可用的属性列表)。 我可以做任何类似“select *”的事吗? – BIBD 2009-04-29 14:50:39

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 

警告:动态查询可能是维护头痛。

0

这是这个问题的重复:Help needed with Dynamic Pivoting in SQL2005是的,它可以用动态SQL做一些技巧,你甚至可以做一个select over结果返回或创建一个视图,但如果你的表有超过1000条记录,我不会推荐这种方法,因为性能最好不好。

0

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