假定有一个表定义的列为A、B 、C(A、B为联合主键)
里面有三条记录,
A B C
1 e 10
1 f 20
1 g 30
能够生产一个这样的视图吗?,视图里面列的定义如下:
A、e、f、g
最后查询试图返回的结果如下:
A e f g
1 10 20 30SQL Server2005支持这种技术吗?我这样做的目的是不想把表的列定义成A、e、f、g,因为efg是动态改变的。
如果没有这个技术,还有其他好的方法吗?
里面有三条记录,
A B C
1 e 10
1 f 20
1 g 30
能够生产一个这样的视图吗?,视图里面列的定义如下:
A、e、f、g
最后查询试图返回的结果如下:
A e f g
1 10 20 30SQL Server2005支持这种技术吗?我这样做的目的是不想把表的列定义成A、e、f、g,因为efg是动态改变的。
如果没有这个技术,还有其他好的方法吗?
insert into #t
select 1,'e',10 union all
select 1,'f',20 union all
select 1,'g',30
go
declare @sql varchar(1000)
set @sql='select A'
select @sql=@sql+',sum(case B when '''+t.B+''' then C else 0 end) as '''+t.B+'''' from (select distinct B from #t ) t
set @sql=@sql+' from #t group by A'exec(@sql)drop table #t
set @s='select A'
select @s=@s+',['+B+']=max(case B when '''+B+''' then C end)' from 表 group by B
set @s=@s+' from 表 group by A order by A'
exec(@s)
declare @ls_update varchar(500)
decalre cur_B
select distinct B from TB
where from TB
open cur_B
fetch cur_B into @ls_colname
while @@fetch_status
begin
exec('alter table #temp add ' + @ls_colname + ' int ')
select @ls_update = 'update a set ' + @ls_colname + '= b.C from #temp a, TB b where a.A = b.A and b.B = ' + @ls_colname
exec(@ls_update)
fetch cur_B into @ls_colname
endselect * from #tempdrop table #temp
drop table #tmp
declare @s varchar(8000)
set @s='select A'
select @s=@s+',['+B+']=max(case B when '''+B+''' then C end)' from 表 group by B
set @s=@s+' from 表 group by A order by A'
exec(@s)
GO-- 测试数据
CREATE TABLE tb(A int,B varchar(1),C int)
INSERT tb SELECT 1,'e',10
UNION ALL SELECT 1,'f',20
UNION ALL SELECT 1,'g',30
GO-- 创建视图
CREATE VIEW v_test
AS
SELECT * FROM OPENROWSET('SQLOLEDB', 'trusted_Connection=yes', '
SET NOCOUNT ON
SET FMTONLY OFF
DECLARE @sql varchar(8000)
SET @sql = ''SELECT A''
SELECT @sql = @sql
+ '', '' + QUOTENAME(B)
+ '' = SUM(CASE B WHEN '' + QUOTENAME(B, '''''''')
+ '' THEN C ELSE 0 END)''
FROM tempdb.dbo.tb
GROUP BY B
SET @sql = @sql + '' FROM tempdb.dbo.tb GROUP BY A''
EXEC(@sql)')
GO-- 查询视图
SELECT * FROM v_test
GO-- 删除测试
DROP TABLE tb
DROP VIEW v_test