假定有一个表定义的列为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是动态改变的。
如果没有这个技术,还有其他好的方法吗?

解决方案 »

  1.   

    create table  #t(A int,B varchar(1),C int)
    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
      

  2.   

    SQL Server2000里定义不了这样的视图,可以用动态SQL: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)
      

  3.   

    select distinct A into #temp from TBdeclare @ls_colname varchar(10)
    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
      

  4.   

    五星的:
    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)
      

  5.   

    USE tempdb
    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