如有两张表:
users (学员表)
       userId(学员编号) userName(学员姓名) userSex(学员性别)
          1001              a                      男
          1002              b                      女
------------------------------------------------------------------------------
scores(分数表)
       userId(学员编号) subject(科目名称) score(分数)
          1001             语文              30
          1001             数学              20
          1002             英语              40
          1002             语文              34要求查询的结果是:
      学员编号, 学员姓名,科目名称1,分数1,科目名称2 ,分数2请问 sql语句怎么写? 我不太清楚 怎么把科目名称的内容当做一列来查询然后每个科目变成新的一列?请高手指教?       
       

解决方案 »

  1.   

    查询语句:
    select u.userId,u.userName,s.subject1,s.score1,s.subject2,s.score2
    from users u,
    (select distinct S1.userid,S1.subject subject1,S1.score score1,S2.subject subject2,S2.score score2 from scores S1,scores S2
    where S1.userID = S2.userID and S1.subject <> S2.subject and S1.score <> S2.score ) s
    where u.userID = S.userID
    但是结果会出现两行同一学员的相同信息。
                                                                               
      

  2.   

    哦,上面有点错误(两门功课成绩可能相同),如只保留一行相同数据可以限制subject1 = '语文',修改为:
    select u.userId,u.userName,s.subject1,s.score1,s.subject2,s.score2 
    from users u, 
    (select distinct S1.userid,S1.subject subject1,S1.score score1,S2.subject subject2,S2.score score2 from scores S1,scores S2 
    where S1.userID = S2.userID and S1.subject <> S2.subject ) s 
    where u.userID = S.userID and s.subject1 = '语文'
      

  3.   


    if object_id('users') is not null
      drop table users
    create table users
    (
     userid varchar(4),
     username varchar(4),
     usersex varchar(4)
    )
    if object_id('scores') is not null
      drop table scores
    create table scores
    (
     userid varchar(4),
     subject varchar(4),
     score int
    )insert users
    select '1001','a','男' union all
    select '1002','b','女'insert scores 
    select '1001','语文',30 union all
    select '1001','数学',20 union all
    select '1002','英语',40 union all
    select '1002','语文', 34select * from users
    select * from scoresselect u.userid,max(
    case c.subject when '语文' then score
    else 0 end
    )  语文,
    max(case c.subject when '数学' then score 
    else  0 end) 数学,
    max(case c.subject when '英语' then score 
    else  0 end) 英语
    from users u,scores c
    where u.userid=c.userid group by u.userid
    /**
    userid 语文          数学          英语          
    ------ ----------- ----------- ----------- 
    1001   30          20          0
    1002   34          0           40(所影响的行数为 2 行)
    **/
      

  4.   

    行列转换,见:http://blog.csdn.net/htl258/archive/2009/03/02/3947993.aspx
      

  5.   

    http://blog.csdn.net/htl258/archive/2009/03/02/3947993.aspx
      

  6.   

    if object_id('users') is not null
      drop table users
    create table users
    (
     userid varchar(4),
     username varchar(4),
     usersex varchar(4)
    )
    if object_id('scores') is not null
      drop table scores
    create table scores
    (
     userid varchar(4),
     subject varchar(4),
     score int
    )insert users
    select '1001','a','男' union all
    select '1002','b','女'insert scores 
    select '1001','语文',30 union all
    select '1001','数学',20 union all
    select '1002','英语',40 union all
    select '1002','语文', 34select * from users
    select * from scoresselect distinct u.userid,
    max(case c.subject when '语文' then 
    '语文' else '' end
    )  科目名称1,
    max(case c.subject when '语文' then 
    c.score else 0 end
    )  分数1,
    max(case c.subject when '数学' then 
    '数学' else 'no record' end
    )  科目名称2,
    max(case c.subject when '数学' then 
    c.score else 0 end
    )  分数2,
    max(case c.subject when '英语' then 
    '英语' else 'no record' end
    )  科目名称3,
    max(case c.subject when '英语' then 
    c.score else 0 end
    )  分数3
    from users u,scores c
    where u.userid=c.userid group by u.userid/**
    userid 科目名称1 分数1         科目名称2 分数2         科目名称3     分数3         
    ------ ----- ----------- ----- ----------- --------- ----------- 
    1001   语文    30          无     20          no record 0
    1002   语文    34          无     0           英语        40(所影响的行数为 2 行)**/
      

  7.   


    userid 科目名称1 分数1         科目名称2     分数2         科目名称3     分数3         
    ------ ----- ----------- --------- ----------- --------- ----------- 
    1001   语文    30          数学        20          no record 0
    1002   语文    34          no record 0           英语        40(所影响的行数为 2 行)
      

  8.   

    declare @sql varchar(8000) 
    set @sql = 'select u.userid ' 
    select @sql = @sql + ' , max(case c.subject when ''' + a.subject + ''' then c.score else 0 end) [' + a.subject + ']' 
    from (select distinct subject from scores) aset @sql = @sql + ' from users u,scores c
    where u.userid=c.userid group by u.userid

    exec(@sql) /**
    userid 数学          英语          语文          
    ------ ----------- ----------- ----------- 
    1001   20          0           30
    1002   0           40          34**/
      

  9.   

    /*
    标题:普通行列转换(version 2.0)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-03-09
    地点:广东深圳
    说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    想变成(得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    -------------------
    */create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
    select 姓名 as 姓名 ,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
    set @sql = '[' + @sql + ']'
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')---------------------------------/*
    问题:在上述结果的基础上加平均分,总分,得到如下结果:
    姓名 语文 数学 物理 平均分 总分 
    ---- ---- ---- ---- ------ ----
    李四 74   84   94   84.00  252
    张三 74   83   93   83.33  250
    */给LZ参考
      

  10.   

    请教楼上的几位,在select语句中的max(case when then end)中的max起什么作用?只是用来与group by进行配对吗?