[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.   

    /*
    问题:如果上述两表互相换一下:即表结构和数据为:
    姓名 语文 数学 物理
    张三 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。
      

  2.   

    /*
    问题:如果上述两表互相换一下:即表结构和数据为:
    姓名 语文 数学 物理
    张三 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。--------------------
      

  3.   

    if object_id('tb') is not null drop table tb
    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
    ----------------*/