例:表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' 可以查出该表的字段名与对应描述,但要生成上述格式,能不能用一条语句,得出来,谢谢!
字段名有: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' 可以查出该表的字段名与对应描述,但要生成上述格式,能不能用一条语句,得出来,谢谢!
普通行列转换
(爱新觉罗.毓华 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
--查出表的各个字段的所有属性
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
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*/
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')
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 李
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执行的结果,用程序怎么去读出来?