sql多个字段列转换成一列

yilonglove 2009-03-30 08:48:36
有一表是这样的:
表1:
序号 名称 数学 语文 英语 历史 地理 政治 日期
1 张无 80 90 90 80 90 90 1月
2 张无 70 90 50 80 60 80 2月
3 张无 80 90 80 60 80 60 3月
4 张六 80 90 90 80 90 90 1月
5 张六 70 90 50 80 60 80 2月
6 张六 80 90 80 60 80 60 3月
7 张起 80 90 90 80 90 90 1月
8 张起 70 90 50 80 60 80 2月
9 张起 80 90 80 60 80 60 3月

转换成如下:

序号 名称 课程 1月 2月 3月
1 张无 数学 80 70 80
2 张无 语文 90 90 90
3 张无 英语 90 50 80
4 张无 历史 80 80 60
5 张无 地理 90 60 80
6 张无 政治 90 80 60
7 张六 数学 80 70 80
8 张六 语文 90 90 90
9 张六 英语 90 50 80
10 张六 历史 80 80 60
11 张六 地理 90 60 80
12 张六 政治 90 80 60
13 张起 数学 80 70 80
14 张起 语文 90 90 90
15 张起 英语 90 50 80
16 张起 历史 80 80 60
17 张起 地理 90 60 80
18 张起 政治 90 80 60

请各位高手帮帮忙,我老板崔得急,那位要是做出来了,我把我的积分全送出去!我的QQ:37682407. 用什么都方法都行的!谢谢各位了.
...全文
364 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongwenly 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jinjazz 的回复:]
引用 25 楼 yilonglove 的回复:
要是数据有2000条怎么办,总不能一条一条insert吧!请各位再帮帮忙!


见过笨的,没见过这么笨的
[/Quote]
那就两条两条insert,效率高点
qinqinhao 2009-03-31
  • 打赏
  • 举报
回复
ding
jinjazz 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 yilonglove 的回复:]
要是数据有2000条怎么办,总不能一条一条insert吧!请各位再帮帮忙!
[/Quote]

见过笨的,没见过这么笨的
sdhdy 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 yilonglove 的回复:]
要是数据有2000条怎么办,总不能一条一条insert吧!请各位再帮帮忙!
[/Quote]
那就:
--这样有多少条插多少,当然要注意字段对应。
insert tb select * from ta
dawugui 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 yilonglove 的回复:]
要是数据有2000条怎么办,总不能一条一条insert吧!请各位再帮帮忙!
[/Quote]
insert,create之类的语句,是我们的建表和测试数据,你需要使用的是
select那样的语句.
htl258_Tony 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 yilonglove 的回复:]
要是数据有2000条怎么办,总不能一条一条insert吧!请各位再帮帮忙!
[/Quote]不需要;
select 
名称,
课程,
[1月]=max(case 日期 when '1月' then 成绩 end),
[2月]=max(case 日期 when '2月' then 成绩 end),
[3月]=max(case 日期 when '3月' then 成绩 end)
from
(select 名称,'数学' 课程,数学 成绩,日期 from @t
union all select 名称,'语文',语文,日期 from @t
union all select 名称,'英语',英语,日期 from @t
union all select 名称,'历史',历史,日期 from @t
union all select 名称,'地理',地理,日期 from @t
union all select 名称,'政治',政治,日期 from @t
) tb
group by 名称,课程
order by 名称,课程
楼上各位在查询的时候都只用到一条语句,INSERT是建测试表用的.
liangCK 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 yilonglove 的回复:]
要是数据有2000条怎么办,总不能一条一条insert吧!请各位再帮帮忙!
[/Quote]

你数据库里有几条记录有关系吗?

大家写的INSERT是生成测试数据用的。

你直接将上面的SELECT语句拷贝,将表名替换成你的表名,不就行了吗?
yilonglove 2009-03-31
  • 打赏
  • 举报
回复
要是数据有2000条怎么办,总不能一条一条insert吧!请各位再帮帮忙!
大嘴鳄 2009-03-30
  • 打赏
  • 举报
回复
create table tb(序号 int,名称 nvarchar(10), 数学 int, 语文 int,英语 int,历史 int, 地理 int,政治 int, 日期 nvarchar(10))
insert into tb values(1 , N'张无' , 80 , 90 , 90 , 80 , 90 , 90 , N'1月')
insert into tb values(2 , N'张无' , 70 , 90 , 50 , 80 , 60 , 80 , N'2月')
insert into tb values(3 , N'张无' , 80 , 90 , 80 , 60 , 80 , 60 , N'3月')
insert into tb values(4 , N'张六' , 80 , 90 , 90 , 80 , 90 , 90 , N'1月')
insert into tb values(5 , N'张六' , 70 , 90 , 50 , 80 , 60 , 80 , N'2月')
insert into tb values(6 , N'张六' , 80 , 90 , 80 , 60 , 80 , 60 , N'3月')
insert into tb values(7 , N'张起' , 80 , 90 , 90 , 80 , 90 , 90 , N'1月')
insert into tb values(8 , N'张起' , 70 , 90 , 50 , 80 , 60 , 80 , N'2月')
insert into tb values(9 , N'张起' , 80 , 90 , 80 , 60 , 80 , 60 , N'3月')
go

select 序号 = row_number() over(order by 名称 , 课程) , * from (select * from (select 名称 , 课程 , 日期,分数 from tb unpivot (分数 for 课程 in([数学] , [语文] , [英语] , [历史] , [地理] , [政治])) t) m) a pivot (max(分数) for 日期 in ([1月],[2月],[3月])) b

drop table tb

/*
序号 名称 课程 1月 2月 3月
-------------------- ---------- -------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- -----------
1 张六 历史 80 80 60
2 张六 地理 90 60 80
3 张六 政治 90 80 60
4 张六 数学 80 70 80
5 张六 英语 90 50 80
6 张六 语文 90 90 90
7 张无 历史 80 80 60
8 张无 地理 90 60 80
9 张无 政治 90 80 60
10 张无 数学 80 70 80
11 张无 英语 90 50 80
12 张无 语文 90 90 90
13 张起 历史 80 80 60
14 张起 地理 90 60 80
15 张起 政治 90 80 60
16 张起 数学 80 70 80
17 张起 英语 90 50 80
18 张起 语文 90 90 90

(18 行受影响)
*/

嘿嘿,复制了
Herb2 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dawugui 的回复:]
引用 14 楼 ws_hgo 的回复:
建议lZ
家点分
把此贴给结了

我同意,楼主分不够的话,我可以导点给你.
[/Quote]
ws_hgo 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dawugui 的回复:]
引用 17 楼 liangCK 的回复:
引用 16 楼 dawugui 的回复:
引用 14 楼 ws_hgo 的回复:
建议lZ
家点分
把此贴给结了

我同意,楼主分不够的话,我可以导点给你.


乌龟导给点偶吧。。。

你是领导,我可不敢干这事情.
[/Quote]
小梁
不能这样做
不然我举报你的
作为斑竹
要公正
不能到分
这是原则问题
claro 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dawugui 的回复:]
引用 17 楼 liangCK 的回复:
引用 16 楼 dawugui 的回复:
引用 14 楼 ws_hgo 的回复:
建议lZ
家点分
把此贴给结了

我同意,楼主分不够的话,我可以导点给你.


乌龟导给点偶吧。。。

你是领导,我可不敢干这事情.
[/Quote]
给我吧,都乞丐了。
claro 2009-03-30
  • 打赏
  • 举报
回复
帮顶。
dawugui 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 liangCK 的回复:]
引用 16 楼 dawugui 的回复:
引用 14 楼 ws_hgo 的回复:
建议lZ
家点分
把此贴给结了

我同意,楼主分不够的话,我可以导点给你.


乌龟导给点偶吧。。。
[/Quote]
你是领导,我可不敢干这事情.
ws_hgo 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dawugui 的回复:]
引用 14 楼 ws_hgo 的回复:
建议lZ
家点分
把此贴给结了

我同意,楼主分不够的话,我可以导点给你.
[/Quote]
算了
LZ
把我那份
给老D吧
liangCK 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dawugui 的回复:]
引用 14 楼 ws_hgo 的回复:
建议lZ
家点分
把此贴给结了

我同意,楼主分不够的话,我可以导点给你.
[/Quote]

乌龟导给点偶吧。。。
dawugui 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ws_hgo 的回复:]
建议lZ
家点分
把此贴给结了
[/Quote]
我同意,楼主分不够的话,我可以导点给你.
ws_hgo 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dawugui 的回复:]
引用 12 楼 ws_hgo 的回复:
看来老D冲这个月
总版第一
是势在必得啊

你们不和我抢,我的机会就更大.
[/Quote]
现在谁还排在你前面啊
ws_hgo 2009-03-30
  • 打赏
  • 举报
回复
建议lZ
家点分
把此贴给结了
dawugui 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ws_hgo 的回复:]
看来老D冲这个月
总版第一
是势在必得啊
[/Quote]
你们不和我抢,我的机会就更大.
加载更多回复(12)

22,181

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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