现在有三个查询语句分别实现对每个学生参加课外活动情况的记录的查询
select studentid,count(*) querycount from Qry_AllQueryLog where querytypeid=1 and classid=9000 group by studentidselect studentid,count(*) querycount from Qry_AllQueryLog where querytypeid=2 and classid=9000 group by studentidselect studentid,count(*) querycount from Qry_AllQueryLog where querytypeid=3 and classid=9000 group by studentid
Qry_AllQueryLog 是一个记录学生参加课外活动情况的明细表,querytypeid是每个活动的编号,要统计每个学生参加课外活动的方法是将该学生(studentid),的该querytypeid的记录进行累加count
想要达到的效果是将
学生  课外活动 参加次数
小明   打篮球    2
小明   踢足球    5
小明   游泳      3
转换为
学生  打篮球   踢足球   游泳 
小明    2       5      3
的形式
这是典型的行边列的操作,请教哪位高手能够解决啊!!!!

解决方案 »

  1.   

    max +decode
    select student,
           max(case '课外活动' when '打篮球' then 参加次数 else 0 END) 打篮球,
           max(case '课外活动' when '踢足球' then 参加次数 else 0 END) 踢足球 ,
           max(case '课外活动' when '游泳' then 参加次数 else 0 END) 游泳
    from 表
    group by student 
      

  2.   

    select studentid, querytypeid, count(*) querycount 
    from Qry_AllQueryLog where querytypeid in (1,2,3) 
    and classid=9000 
    group by studentid, querytypeid
      

  3.   

    上面的写错了
    select studentid,
           sum(case querytypeid when 1 then querycount else 0 end) querytypeid_1,
           sum(case querytypeid when 2 then querycount else 0 end) querytypeid_2,
           sum(case querytypeid when 3 then querycount else 0 end) querytypeid_3,
    where querytypeid in (1,2,3) 
    and classid=9000
    group by studentid
      

  4.   

    SELECT STUDENTID,
           SUM(DECODE(QUERYTYPEID, 1, 1, 0)) BASKETBALL,
           SUM(DECODE(QUERYTYPEID, 2, 1, 0)) FOOTBALL,
           SUM(DECODE(QUERYTYPEID, 3, 1, 0)) SWIMMING
      FROM QRY_ALLQUERYLOG
     WHERE CLASSID = 9000
     GROUP BY STUDENTID;
      

  5.   

    SELECT STUDENTID,
           SUM(DECODE(QUERYTYPEID, 1, 1, 0)) BASKETBALL,
           SUM(DECODE(QUERYTYPEID, 2, 1, 0)) FOOTBALL,
           SUM(DECODE(QUERYTYPEID, 3, 1, 0)) SWIMMING
      FROM QRY_ALLQUERYLOG
     WHERE CLASSID = 9000
     GROUP BY STUDENTID;
      

  6.   

    楼上的并没有实现count(*) querycount的效果啊
      

  7.   

    可以不用count(*)的,因为SUM(DECODE(QUERYTYPEID, 1, 1, 0)) 代表,求和时是对应到某一球类就累加1,否则累加0
      

  8.   

    行列转换用decode是正解
    select STUDENTID,
           SUM(DECODE(QUERYTYPEID='打篮球', 1, 1, 0)),
           SUM(DECODE(QUERYTYPEID='踢足球', 1, 1, 0)) 
           SUM(DECODE(QUERYTYPEID=' 游泳', 1, 1, 0))  
    from QRY_ALLQUERYLOG 
    group by STUDENTID
      

  9.   

    呵呵,對於固定的是可以用decode來完成 
    動態的在論動中已經有很多寫了,查一下就可以知道