表A
id  name
101  数学
102 语文
103 化学
104英语
表B
SName  Score   NID
张三     85    101
张三     30    102
李四     100   101
李四     70    103
王五     91    102
王五     47    104 
王五     88    101 
王五     65     103想最终显示为       语文  数学  化学 英语
张三   85     30 
李四   100         70
王五   88          65   88
这个sql语句要怎么写呢

解决方案 »

  1.   

    select sname,sum(decode(nid,101,score,0)) "数学",
    sum(decode(nid,102,score,0)) "语文",
    sum(decode(nid,103,score,0)) "化学",
    sum(decode(nid,104,score,0)) "英语",
    from B
    group by sname
      

  2.   

    因为就你知道101... 对应哪个科目啊 没必要用a表了
    --如果你要的话,这个多个表效率肯定低些
    select B.sname,sum(decode(A.name,'数学',B.score,0)) "数学",
    sum(decode(A.name,'语文',B.score,0)) "数学",
    sum(decode(A.name,'化学',B.score,0)) "化学",
    sum(decode(A.name,'英语',B.score,0)) "英语",
    from A,B
    where A.id=B.nid
    group by B.sname
      

  3.   

    WITH  A AS(
    SELECT '101' ID,'数学'NAME FROM DUAL UNION ALL
    SELECT '102','语文' FROM DUAL UNION ALL
    SELECT '103','化学' FROM DUAL UNION ALL
    SELECT '104','英语' FROM DUAL
    ),
    B AS(
    SELECT '张三'SName,85 Score,'101' NID FROM DUAL UNION ALL
    SELECT '张三', 30, '102' FROM DUAL UNION ALL
    SELECT '李四', 100, '101' FROM DUAL UNION ALL
    SELECT '李四', 70, '103' FROM DUAL UNION ALL
    SELECT '王五', 91, '102' FROM DUAL UNION ALL
    SELECT '王五', 47, '104' FROM DUAL UNION ALL
    SELECT '王五', 88, '101' FROM DUAL UNION ALL
    SELECT '王五', 65, '103'FROM DUAL
    )
    SELECT  SName 姓名,Max(Decode(NID,'101',Score,0)) 数学,
    Max(Decode(NID,'102',Score,0)) 语文,
    Max(Decode(NID,'103',Score,0)) 化学,
    Max(Decode(NID,'104',Score,0)) 英语
    FROM a,b
    WHERE a.id=b.nid
    GROUP BY SName;结果:姓名    数学    语文   化学   英语
    -------------------------------------
    张三     85      30     0      0
    李四     100      0     70     0
    王五     88      91     65     47
      

  4.   

    select B.name,sum(decode(A.sname,'数学',B.score,0)) "数学",
    sum(decode(A.sname,'语文',B.score,0)) "数学",
    sum(decode(A.sname,'化学',B.score,0)) "化学",
    sum(decode(A.sname,'英语',B.score,0)) "英语"
    from subject A, results B
    where A.SID=B.SID
    group by B.name1 黄蓉 100 0 0 99
    2 张无忌 66 100 0 0
    3 杨过 0 59 97 76
    4 黄蓉  0 100 0 0
    5 郭靖 0 0 48 0
    6 郭靖  15 0 0 0郭靖 黄蓉都两条了 
      

  5.   

    sum(decode(nid,103,score,0)) "化学", 多了个,
      

  6.   

    --借用下paddy的建表语句
    SQL> ed
    已写入 file afiedt.buf  1  WITH  A AS(
      2  SELECT '101' ID,'数学'NAME FROM DUAL UNION ALL
      3  SELECT '102','语文' FROM DUAL UNION ALL
      4  SELECT '103','化学' FROM DUAL UNION ALL
      5  SELECT '104','英语' FROM DUAL
      6  ),
      7  B AS(
      8  SELECT '张三'SName,85 Score,'101' NID FROM DUAL UNION ALL
      9  SELECT '张三', 30, '102' FROM DUAL UNION ALL
     10  SELECT '李四', 100, '101' FROM DUAL UNION ALL
     11  SELECT '李四', 70, '103' FROM DUAL UNION ALL
     12  SELECT '王五', 91, '102' FROM DUAL UNION ALL
     13  SELECT '王五', 47, '104' FROM DUAL UNION ALL
     14  SELECT '王五', 88, '101' FROM DUAL UNION ALL
     15  SELECT '王五', 65, '103'FROM DUAL
     16  )
     17  select B.sname,sum(decode(A.name,'数学',B.score,0)) "数学",
     18  sum(decode(A.name,'语文',B.score,0)) "数学",
     19  sum(decode(A.name,'化学',B.score,0)) "化学",
     20  sum(decode(A.name,'英语',B.score,0)) "英语"
     21  from A,B
     22  where A.id=B.nid
     23* group by B.sname
     24  /SNAM       数学       数学       化学       英语
    ---- ---------- ---------- ---------- ----------
    王五         88         91         65         47
    李四        100          0         70          0
    张三         85         30          0          0
      

  7.   

    原表
    subject
             SID     SNAME
    1 101 语文
    2 102 数学
    3 103 英语
    4 104 化学
    results
            NAME    SCORE   SID
    1 张无忌 100 101
    2 张无忌 66 102
    3 杨过 59 101
    4 杨过 76 103
    5 杨过 97 104
    6 郭靖  15 102
    7 郭靖 48 104
    8 黄蓉  100 101
    9 黄蓉 100 102
    10 黄蓉 99 103select B.name,sum(decode(A.sname,'数学',B.score,0)) "数学",
    sum(decode(A.sname,'语文',B.score,0)) "数学",
    sum(decode(A.sname,'化学',B.score,0)) "化学",
    sum(decode(A.sname,'英语',B.score,0)) "英语"
    from subject A, results B
    where A.SID=B.SID
    group by B.name
    结果
    1 黄蓉 0 100 99 0
    2 张无忌 100 66 0 0
    3 杨过 59 0 76 97
    4 黄蓉  100 0 0 0
    5 郭靖 0 0 0 48
    6 郭靖  0 15 0 0这个有问题 为什么呢?
      

  8.   

    估计你这两个黄蓉、郭靖不是一样的 会不会是中间有空格什么的
    你select * from results where NAME='黄蓉';
      

  9.   

    select trim(B.name),sum(decode(A.sname,'数学',B.score,0)) "数学",
    sum(decode(A.sname,'语文',B.score,0)) "数学",
    sum(decode(A.sname,'化学',B.score,0)) "化学",
    sum(decode(A.sname,'英语',B.score,0)) "英语"
    from subject A, results B
    where A.SID=B.SID
    group by trim(B.name)
      

  10.   

    select sum(decode(A.sname,'数学',B.score,null)) "数学",
    sum(decode(A.sname,'语文',B.score,null)) "数学",
    sum(decode(A.sname,'化学',B.score,null)) "化学",
    sum(decode(A.sname,'英语',B.score,null)) "英语"
    from subject A, results B
    where A.SID=B.SID
    group by trim(B.name)
      

  11.   

    这样写 表A是死的呀
    那我突然想加一条内容 那是不是还要修改sql语句呀 
    这样不通用呀