竖变横,并添加和字段名称一样的一条记录

smiletosky 2008-02-29 11:22:01
比如表名 TBL_XQ,
字段 bh,name
内容 01,北区
02,南区
03,西区
04,西南区
记录数不定,形成这样的视图
字段 北区,南区,西区,西南区

并添加一行这样的字段
北区,南区,西区,西南区
最后结果是这样的
字段:北区,南区,西区,西南区
记录:北区,南区,西区,西南区

多谢啊

...全文
76 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pt1314917 2008-02-29
  • 打赏
  • 举报
回复

create table tb(bh varchar(4),name varchar(10))
insert into tb values('001','北区')
insert into tb values('002','南区')
insert into tb values('003','西区')
insert into tb values('004','西南区')
go


declare @sql varchar(8000)
set @sql=''
select @sql=@sql+',['+name+']=max(case name when '''+name+''' then name else '''' end)'
from (select distinct name from tb)a
set @sql='select '+stuff(@sql,1,1,'')+' from tb'
exec(@sql)

wzy_love_sly 2008-02-29
  • 打赏
  • 举报
回复

create table tb(bh varchar(10),name varchar(10))
insert into tb select '01','北区'
insert into tb select '02','南区'
insert into tb select '03','西区'
insert into tb select '04','西南区'

declare @sql varchar(8000)
select @sql = isnull(@sql+',','')+ ' max(case name when ''' + name + ''' then name end) [' + name + ']'
from (select distinct name from tb) as a
exec('select'+@sql + ' from tb ')


北区 南区 西南区 西区
北区 南区 西南区 西区
dawugui 2008-02-29
  • 打赏
  • 举报
回复
create table tb(name varchar(10))
insert into tb values('北区')
insert into tb values('南区')
insert into tb values('西区')
insert into tb values('西南区')
go

--方法一
declare @sql varchar(1000)
set @sql = ''
select @sql = @sql + t.name + ',' from (select name from tb) as t
set @sql='select result = ''' + @sql + ''''
exec(@sql)
/*
result
----------------------
北区,南区,西区,西南区,
*/

--方法二
declare @output varchar(8000)
select @output = coalesce(@output + ',' , '') + name from tb
print @output
/*
北区,南区,西区,西南区
*/

drop table tb

dawugui 2008-02-29
  • 打赏
  • 举报
回复
create table tb(name varchar(10))
insert into tb values('北区')
insert into tb values('南区')
insert into tb values('西区')
insert into tb values('西南区')
go

declare @sql varchar(1000)
set @sql = ''
select @sql = @sql + t.name + ',' from (select name from tb) as t
set @sql='select result = ''' + @sql + ''''
exec(@sql)

drop table tb

/*
result
----------------------
北区,南区,西区,西南区,
*/
奔跑的蜗牛007 2008-02-29
  • 打赏
  • 举报
回复
select 字段,case name when '北区' then name as '北区',case name when '南区' then name as '南区',case name when '西区' then name as '西区',case name when '西南区' then name as '西南区'
from table where
wzy_love_sly 2008-02-29
  • 打赏
  • 举报
回复
字段:北区,南区,西区,西南区
记录:北区,南区,西区,西南区
一样?
dawugui 2008-02-29
  • 打赏
  • 举报
回复
/*如何将一列中所有的值一行显示
数据源
a
b
c
d
e
结果
a,b,c,d,e
*/

create table tb(col varchar(20))
insert tb values ('a')
insert tb values ('b')
insert tb values ('c')
insert tb values ('d')
insert tb values ('e')
go

--方法一
declare @sql varchar(1000)
set @sql = ''
select @sql = @sql + t.col + ',' from (select col from tb) as t
set @sql='select result = ''' + @sql + ''''
exec(@sql)
/*
result
----------
a,b,c,d,e,
*/

--方法二
declare @output varchar(8000)
select @output = coalesce(@output + ',' , '') + col from tb
print @output
/*
a,b,c,d,e
*/

drop table tb

wzy_love_sly 2008-02-29
  • 打赏
  • 举报
回复
/*
--转龟
普通行列转换
(爱新觉罗.毓华 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 end

drop table tb1

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧