我有一个如下视图(做了一个视图,因为我认为访问更复杂的表会更容易)
ID | aText1 | aText2 | aInt1 | aInt2
-------------------------------------
1 | ABC1 | XYZ1 | 2 | 20
2 | ABC1 | XYZ2 | 3 | 25
3 | ABC2 | XYZ2 | 1 | 30
4 | ABC2 | XYZ1 | 4 | 35
我需要阅读结果
| XYZ1 | XYZ2
aText1 | aInt1 | aInt2 | aInt1 | aInt2
---------------------------------------
ABC1 | 2 | 20 | 3 | 25
ABC2 | 1 | 30 | 4 | 35
我尝试了各种各样的支点,但都失败了。 aText1
和aText2
可以是任意数量的值。尽可能接近这个解决方案真的很有帮助
答案 0 :(得分:1)
我通常使用动态sql。像这样的东西
create table #T
(
ID int,
aText1 varchar(4),
aText2 varchar(4),
aInt1 int,
aInt2 int
)
insert into #T
select 1, 'ABC1', 'XYZ1', 2, 20
union
select 2, 'ABC1', 'XYZ2', 3, 25
union
select 3, 'ABC2', 'XYZ2', 1, 30
union
select 4, 'ABC2', 'XYZ1', 4, 35
declare @sql nvarchar(max)
set @sql = 'select aText1 '
select @sql = @sql + ', SUM(case when aText2 = ''' + aText2 + ''' then aInt1 end) as [' + aText2 + ' - aInt1] '+
', SUM(case when aText2 = ''' + aText2 + ''' then aInt2 end) as [' + aText2 + ' - aInt2]'
from
(
select distinct aText2 from #T
) T
set @sql = @sql + ' from #T group by aText1'
exec sp_executeSQL @sql
drop table #T
或者你可以创建另一个视图(比如我下一个例子中的#T2)并使用PIVOT
create table #T
(
ID int,
aText1 varchar(4),
aText2 varchar(4),
aInt1 int,
aInt2 int
)
insert into #T
select 1, 'ABC1', 'XYZ1', 2, 20
union
select 2, 'ABC1', 'XYZ2', 3, 25
union
select 3, 'ABC2', 'XYZ2', 1, 30
union
select 4, 'ABC2', 'XYZ1', 4, 35
create table #T2
(
aText1 varchar(4),
aText2 varchar(20),
aValue int
)
insert into #T2
select aText1, aText2 + ' - aInt1' as aText2, aInt1
from #T
union
select aText1, aText2 + ' - aInt2', aInt2
from #T
declare @sql nvarchar(max), @columns nvarchar(max)
set @columns = ''
select @columns = @columns + ', [' + aText2 + ']'
from (select distinct aText2 from #T2) as T
set @columns = substring(@columns, 2, len(@columns))
set @sql =
'
SELECT *
FROM
(SELECT
aText1,
aText2,
aValue
FROM
#T2
) AS SourceTable
PIVOT
(
SUM(aValue)
FOR aText2 in ('+@columns+')
) AS PivotTable'
exec sp_executeSQL @SQL
drop table #T2
drop table #T