TSQL 等效于 MS Access 交叉表查询
Posted
技术标签:
【中文标题】TSQL 等效于 MS Access 交叉表查询【英文标题】:TSQL equivalent of an MS Access Crosstab query 【发布时间】: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
我的计划是创建一个类似交叉表的视图,让他们可以直接报告。
【问题讨论】:
【参考方案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 语句,但您的报告工具应该能够使用矩阵/数据透视表/交叉表模板为您(动态!)执行此操作。
【讨论】:
以上是关于TSQL 等效于 MS Access 交叉表查询的主要内容,如果未能解决你的问题,请参考以下文章