例:表gz
字段名有:bh   xm  xb  gz  ........等多字段名
对应记录:001  赵  男  1000 .......
        002   王  女  1200 ........该表的字段名的描述对应如下:
bh  编号
xm  姓名
xb  性别
gz  工资
... ...
... ...
等等我想生成这样的表就是把字段名的描述变成字段名:结果如下:编号  姓名  性别  工资  ........等多字段名
001  赵  男   1000 .......
002   王  女   1200 ........
我知道用Select field=A.Name, fieldmemo=IsNull(G.[value],''),'m_truck' as tablename From syscolumns A Left Join systypes B On A.Xtype=B.xusertype Inner Join sysobjects D On A.ID=D.ID And D.Xtype='U' And D.Name<>'dtproperties' Left Join sysproperties G On A.ID=G.ID And A.colid=G.smallid Where D.Name='m_truck' 可以查出该表的字段名与对应描述,但要生成上述格式,能不能用一条语句,得出来,谢谢!

解决方案 »

  1.   

    /*
    普通行列转换
    (爱新觉罗.毓华 2007-11-18于海南三亚)假设有张学生成绩表(tb)如下:
    Name Subject Result
    张三 语文  74
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94
    */-------------------------------------------------------------------------
    /*
    想变成 
    姓名         语文        数学        物理          
    ---------- ----------- ----------- ----------- 
    李四         74          84          94
    张三         74          83          93
    */create table tb
    (
       Name    varchar(10) ,
       Subject varchar(10) ,
       Result  int
    )insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
    insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
    insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
    insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
    insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
    insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
    go--静态SQL,指subject只有语文、数学、物理这三门课程。
    select name 姓名,
      max(case subject when '语文' then result else 0 end) 语文,
      max(case subject when '数学' then result else 0 end) 数学,
      max(case subject when '物理' then result else 0 end) 物理
    from tb
    group by name
    /*
    姓名         语文        数学        物理          
    ---------- ----------- ----------- ----------- 
    李四         74          84          94
    张三         74          83          93
    */--动态SQL,指subject不止语文、数学、物理这三门课程。
    declare @sql varchar(8000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
    from (select distinct Subject from tb) as a
    set @sql = @sql + ' from tb group by name'
    exec(@sql) 
    /*
    姓名         数学        物理        语文          
    ---------- ----------- ----------- ----------- 
    李四         84          94          74
    张三         83          93          74
    */-------------------------------------------------------------------
    /*加个平均分,总分
    姓名         语文        数学        物理        平均分                总分          
    ---------- ----------- ----------- ----------- -------------------- ----------- 
    李四         74          84          94          84.00                252
    张三         74          83          93          83.33                250
    */--静态SQL,指subject只有语文、数学、物理这三门课程。
    select name 姓名,
      max(case subject when '语文' then result else 0 end) 语文,
      max(case subject when '数学' then result else 0 end) 数学,
      max(case subject when '物理' then result else 0 end) 物理,
      cast(avg(result*1.0) as decimal(18,2)) 平均分,
      sum(result) 总分
    from tb
    group by name
    /*
    姓名         语文        数学        物理        平均分                总分          
    ---------- ----------- ----------- ----------- -------------------- ----------- 
    李四         74          84          94          84.00                252
    张三         74          83          93          83.33                250
    */--动态SQL,指subject不止语文、数学、物理这三门课程。
    declare @sql1 varchar(8000)
    set @sql1 = 'select Name as ' + '姓名'
    select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
    from (select distinct Subject from tb) as a
    set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
    exec(@sql1) 
    /*
    姓名         数学        物理        语文        平均分                总分          
    ---------- ----------- ----------- ----------- -------------------- ----------- 
    李四         84          94          74          84.00                252
    张三         83          93          74          83.33                250
    */drop table tb ---------------------------------------------------------
    ---------------------------------------------------------
    /*
    如果上述两表互相换一下:即姓名 语文 数学 物理
    张三 74  83  93
    李四 74  84  94想变成 
    Name       Subject Result      
    ---------- ------- ----------- 
    李四         语文      74
    李四         数学      84
    李四         物理      94
    张三         语文      74
    张三         数学      83
    张三         物理      93
    */create table tb1
    (
       姓名 varchar(10) ,
       语文 int ,
       数学 int ,
       物理 int
    )insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
    insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)select * from
    (
      select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
      union all
      select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
      union all
      select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
    ) t
    order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end--------------------------------------------------------------------
    /*加个平均分,总分
    Name       Subject     Result               
    ---------- -------    -------------------- 
    李四         语文      74.00
    李四         数学      84.00
    李四         物理      94.00
    李四         平均分    84.00
    李四         总分      252.00
    张三         语文      74.00
    张三         数学      83.00
    张三         物理      93.00
    张三         平均分    83.33
    张三         总分      250.00
    */select * from
    (
      select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
      union all
      select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
      union all
      select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
      union all
      select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
      union all
      select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
    ) t
    order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 enddrop table tb1
      

  2.   

    这样?select bh 编号, xm 工资, xb 性别 , gz 工资 .... from 表gz
      

  3.   


    --查出表的各个字段的所有属性
    SELECT 
        表名       = case when a.colorder=1 then d.name else '' end,
        表说明     = case when a.colorder=1 then isnull(f.value,'') else '' end,
        字段序号   = a.colorder,
        字段名     = a.name,
        标识       = case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end,
        主键       = case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (
                         SELECT name FROM sysindexes WHERE indid in(
                            SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then '√' else '' end,
        类型       = b.name,
        占用字节数 = a.length,
        长度       = COLUMNPROPERTY(a.id,a.name,'PRECISION'),
        小数位数   = isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
        允许空     = case when a.isnullable=1 then '√'else '' end,
        默认值     = isnull(e.text,''),
        字段说明   = isnull(g.[value],'')
    FROM 
        syscolumns a
    left join 
        systypes b 
    on 
        a.xusertype=b.xusertype
    inner join 
        sysobjects d 
    on 
        a.id=d.id  and d.xtype='U' and  d.name<>'dtproperties'
    left join 
        syscomments e 
    on 
        a.cdefault=e.id
    left join 
        sysproperties g 
    on 
        a.id=g.id and a.colid=g.smallid  
    left join 
        sysproperties f 
    on 
        d.id=f.id and f.smallid=0
    where 
        d.name='要查询的表'    --如果只查询指定表,加上此条件
    order by 
        a.id,a.colorder
      

  4.   

    一条恐怕不行:CREATE TABLE gz(bh VARCHAR(20),xm VARCHAR(20),xb VARCHAR(20),gz INT)
    INSERT gz SELECT '001','赵','男',1000
    UNION ALL SELECT '002','王','女',1200CREATE TABLE ms(zd VARCHAR(20),ms VARCHAR(20))
    INSERT ms SELECT 'bh',  '编号' 
    INSERT ms SELECT 'xm'  ,'姓名' 
    UNION ALL SELECT 'xb'  ,'性别' 
    UNION ALL SELECT 'gz'  ,'工资' declare @a varchar(8000)
    select @a=isnull(@a+',','')+name+' as '+ ms from syscolumns a,ms b where a.name=b.zd and a.id=object_id('gz') ORDER BY colid
    EXEC('select '+@a+' from gz')--result
    /*编号                   姓名                   性别                   工资          
    -------------------- -------------------- -------------------- ----------- 
    001                  赵                    男                    1000
    002                  王                    女                    1200*/
      

  5.   

    declare @SQL varchar(1000)select @SQL = isnull(@SQL+',', '')+a.name+isnull(' as '+convert(varchar(8000),b.value),'')
    from syscolumns a left join sysproperties b on a.id=b.id and a.colid=b.smallid
    where a.id=object_id('m_truck')
    order by a.colidexec ('select ' + @SQL + ' from m_truck')
      

  6.   

    create table a(id int,name varchar(10))
    insert into a select 1,'王'
    insert into a select 2,'李'create table b(id varchar(10),name varchar(10))
    insert into b select 'id','编号'
    insert into b select 'name','名称'declare @sql varchar(8000)
    select @sql=isnull(@sql+',','')+id+' as ['+name +']'
    from b
    exec('select '+@sql+' from a')编号 名称
    1 王
    2 李
      

  7.   

    declare @SQL varchar(1000)select @SQL = isnull(@SQL+',', '')+a.name+isnull(' as '+convert(varchar(8000),b.value),'')
        from syscolumns a left join sysproperties b on a.id=b.id and a.colid=b.smallid
        where a.id=object_id('m_truck')
        order by a.colidexec ('select ' + @SQL + ' from m_truck')
    再问一下像exec执行的结果,用程序怎么去读出来?