[id] [name] [math] [chinese] [english] [chymist]
1 张三 12.34 23.45 34.56 45.67
2 李四 11.11 22.22 33.33 44.44
3 王五 55.55 55.55 55.55 55.55
4 赵六 66.66 66.66 66.66 66.66
5 田七 77.77 77.77 77.77 77.77我想得到的查询结果为:
go
id 姓名 科目 分数
1 张三 math 12.34
1 张三 chinese 23.45
1 张三 english 34.56
1 张三 chymist 45.67
......谁能帮着写一下.谢谢 ?
建表语句,和数据语句如下.
USE [Test]
GO
/****** 对象: Table [dbo].[achievement] 脚本日期: 06/15/2009 19:57:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[achievement](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[math] [decimal](18, 2) NULL,
[chinese] [decimal](18, 2) NULL,
[english] [decimal](18, 2) NULL,
[chymist] [decimal](18, 2) NULL,
CONSTRAINT [PK_achievement] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]GO
SET ANSI_PADDING OFF
go
--添加数据
insert into achievement([name],[math],[chinese],[english],[chymist])values('张三',12.34,23.45,34.56,45.67);
go
insert into achievement([name],[math],[chinese],[english],[chymist])values('李四',11.11,22.22,33.33,44.44);
go
insert into achievement([name],[math],[chinese],[english],[chymist])values('王五',55.55,55.55,55.55,55.55);
go
insert into achievement([name],[math],[chinese],[english],[chymist])values('赵六',66.66,66.66,66.66,66.66);
go
insert into achievement([name],[math],[chinese],[english],[chymist])values('田七',77.77,77.77,77.77,77.77);
go
select * from achievement;
go
1 张三 12.34 23.45 34.56 45.67
2 李四 11.11 22.22 33.33 44.44
3 王五 55.55 55.55 55.55 55.55
4 赵六 66.66 66.66 66.66 66.66
5 田七 77.77 77.77 77.77 77.77我想得到的查询结果为:
go
id 姓名 科目 分数
1 张三 math 12.34
1 张三 chinese 23.45
1 张三 english 34.56
1 张三 chymist 45.67
......谁能帮着写一下.谢谢 ?
建表语句,和数据语句如下.
USE [Test]
GO
/****** 对象: Table [dbo].[achievement] 脚本日期: 06/15/2009 19:57:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[achievement](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[math] [decimal](18, 2) NULL,
[chinese] [decimal](18, 2) NULL,
[english] [decimal](18, 2) NULL,
[chymist] [decimal](18, 2) NULL,
CONSTRAINT [PK_achievement] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]GO
SET ANSI_PADDING OFF
go
--添加数据
insert into achievement([name],[math],[chinese],[english],[chymist])values('张三',12.34,23.45,34.56,45.67);
go
insert into achievement([name],[math],[chinese],[english],[chymist])values('李四',11.11,22.22,33.33,44.44);
go
insert into achievement([name],[math],[chinese],[english],[chymist])values('王五',55.55,55.55,55.55,55.55);
go
insert into achievement([name],[math],[chinese],[english],[chymist])values('赵六',66.66,66.66,66.66,66.66);
go
insert into achievement([name],[math],[chinese],[english],[chymist])values('田七',77.77,77.77,77.77,77.77);
go
select * from achievement;
go
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。--------------------
create table tb([id]int,[name] varchar(10),[math] decimal(4,2),[chinese]decimal(4,2), [english] decimal(4,2),[chymist] decimal(4,2) )insert tb
select 1,'张三',12.34,23.45,34.56,45.67 union all
select 2,'李四',11.11,22.22,33.33,44.44 union all
select 3,'王五',55.55,55.55,55.55,55.55 union all
select 4,'赵六',66.66,66.66,66.66,66.66 union all
select 5,'田七',77.77,77.77,77.77,77.77select t.*
from
(
select [id],[name],科目='math',分数=math from tb
union all
select [id],[name],科目='chinese',分数=chinese from tb
union all
select [id],[name],科目='english',分数=english from tb
union all
select [id],[name],科目='chymist',分数=chymist from tb
) t
order by [id]
/*------------------
1 张三 math 12.34
1 张三 chinese 23.45
1 张三 english 34.56
1 张三 chymist 45.67
2 李四 english 33.33
2 李四 chinese 22.22
2 李四 math 11.11
2 李四 chymist 44.44
3 王五 chymist 55.55
3 王五 math 55.55
3 王五 chinese 55.55
3 王五 english 55.55
4 赵六 english 66.66
4 赵六 chinese 66.66
4 赵六 math 66.66
4 赵六 chymist 66.66
5 田七 chymist 77.77
5 田七 math 77.77
5 田七 chinese 77.77
5 田七 english 77.77
----------------*/