1、问题大致是这样的,有一个属性可再分的数据表需要通过查询语句把数据表整合成一个属性不可再分的临时表,例如:
原始表
-------------------
学号     分数     科目
001     78      数学
001     65      语文
002     89      数学
002     98      外语
003     87      数学
003     87      语文
003     98      外语
-------------------
整合后的临时表:
--------------------------
学号     数学     语文    外语
001     78      65     0
002     89      0      98
003     87      87     98
--------------------------2、自动排序问题。根据类别分类按照信息条目的多少来自动排序,例如:
原始表:
----------------------
ID      标题     类别
1       测试1   计算机系
2       测试2   计算机系
3       测试3   机械系
4       测试4   机械系
5       测试5   生化系
----------------------
整合后的临时表:
----------------------
类别     数量     排名
计算机系 2       1 
机械系   2       1
生化系   1       2
---------------------- 
这两个问题都做过了,但都没弄出来,现在出分求答案或者解决思路!!

解决方案 »

  1.   

    1、
    select 学号,sum(if(科目='数学',分数,0)) as 数学,
    sum(if(科目='语文',分数,0)) as 语文,
    sum(if(科目='外语',分数,0)) as 外语
     from tt
    group by 学号
      

  2.   

    1、
    select 学号,sum(if(科目='数学',分数,0)) as 数学,
    sum(if(科目='语文',分数,0)) as 语文,
    sum(if(科目='外语',分数,0)) as 外语
     from tt
    group by 学号
      

  3.   

    2
    select a1.lb,a1.数量,count(b1.lb)-1 from (
    select lb,count(*) as 数量 from tf 
    group by lb) a1
    left join
    (
    select lb,count(*) as 数量 from tf  
    group by lb) b1
    on a1.数量<b1.数量+1
    group by a1.lb,a1.数量
      

  4.   

    第一个问题,在mysql中目前还没有交叉表。如果科目是固定的,比较只有这三种,你可以利用一下SUM(IF())这个方法直接快速实现。select 学号,
    sum(if(科目='数学',分数,0) as 数学,
    sum(if(科目='语文',分数,0) as 语文,
    sum(if(科目='外语',分数,0) as 外语
    from yourTable
    group by 学号 如果科目不固定,你则需要利用一下存储过程或者直接在你自己的程序中来实现。一般是动态生成上面这种SQL语句或者直接控制输出格式,(直接控制输出效率上比较高)
      

  5.   

    2、自动排序问题。在MySQL中没有ROW_NUM的功能。 你可以参考一下这个里面介绍的几种实现方法。各有优缺点。http://blog.csdn.net/ACMAIN_CHM/archive/2009/04/20/4095531.aspx
    MySQL中的ROWNUM的实现
      

  6.   

    2、自动排序问题。select a.类别,a.数量,count(b.类别)+1 as 排名
    from 
    (select 类别,count(*) as 数量 from 原始表 group by 类别) a 
    left join 
    (select 类别,count(*) as 数量 from 原始表 group by 类别) b
    on a.数量<b.数量
    group by a.类别,a.数量
    order by 3
      

  7.   

    如果是1,1,2话,再加一层 select distinct 就行了。 没注意。select a.类别,a.数量,count(b.数量)+1 as 排名
    from 
    (select 类别,count(*) as 数量 from 原始表 group by 类别) a 
    left join 
    (select distinct 数量 from (select 类别,count(*) as 数量 from 原始表 group by 类别) b1) b
    on a.数量<b.数量
    group by a.类别,a.数量
    order by 3
      

  8.   

    就第一个问题来看,如果不用SUM(IF())这个方法这个方法,不写存储过程,也不在程序里控制,那还有什么方法可以实现吗?
      

  9.   

    没有,静态的用SUM(IF) OR SUM(CASE WHEN)
    动态用SP,累计字符串得到SQL语句
      

  10.   

    就第一个问题来看,如果不用SUM(IF())这个方法这个方法,不写存储过程,也不在程序里控制,那还有什么方法可以实现吗? 在MySQL中,只能说无。 (如果 case when也不能用)或者用专门的报表工具,比如水晶报表。