您的位置:程序门 -> db2 -> 数据库开发



同一个表的多条数据合并成一条,挺难,请教高手!!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


同一个表的多条数据合并成一条,挺难,请教高手!![已结贴,结贴人:httpftp]
发表于:2007-10-25 23:28:25 楼主
规则是这样的:
表t:
id     school_id     grade     subject_id     student_id
1       s1                   1             a                       001  
2       s1                   1             a                       002
3       s1                   1             b                       111
4       s1                   1             c                       001
5       s1                   1             c                       104
6       s1                   1             d                       021
7       s1                   2             a                       101
8       s1                   2             b                       101

根据school_id和grade分组,取前三个subject_id,并且得到一个flag,如果多于三个设‘1',不足设‘0';同时取每个(school_id     grade     subject_id)下面student_id的个数。
得到结果如下:
school_id   grade   subject_1   subject_2   subject_3   falg   student_sum_1   student_sum_2   student_sum_3
s1                 1           a                   b                   c                   1         2                             1                         2
s1                 2           a                   b                                       0         1                             1

只用sql文。
这个问题我思考了一下午,不得解,求高人们指点。
发表于:2007-10-26 09:57:221楼 得分:30
一个group   +   行转列
发表于:2007-10-26 10:44:192楼 得分:20
http://www.cublog.cn/u/739/showart.php?id=278401
发表于:2007-10-26 18:51:383楼 得分:0
哇哈哈,奋斗了又一下午,终于把这个sql写出来了!

select   t2.school_id,
              t2.grade,
              count(t2.subject_id)   subject_count,
              max(t2.subject_cd1)   subject_cd1,  
              max(t2.subject_cd2)   subject_cd2,  
              max(t2.subject_cd3)   subject_cd3,  
              max(t2.people_count1)   people_count1,
              max(t2.people_count2)   people_count2,
              max(t2.people_count3)   people_count3
from  
        (
            select   t1.school_id,t1.grade,t1.subject_id,  
                  case   t1.row   when   1   then   t1.subject_cd   else   null   end   subject_cd1,
                  case   t1.row   when   2   then   t1.subject_cd   else   null   end   subject_cd2,
                  case   t1.row   when   3   then   t1.subject_cd   else   null   end   subject_cd3,
                  case   t1.row   when   1   then   t1.people_count   else   null   end   people_count1,
                  case   t1.row   when   2   then   t1.people_count   else   null   end   people_count2,
                  case   t1.row   when   3   then   t1.people_count   else   null   end   people_count3,
            from  
                (
                    select   frownumber()over(partition   by   school_id,grade,subject_id)   as   row,
                                  school_id,
                                  grade,
                                  subject_id,
                                  count(student_id)   people_count
                    from   t   group   by   school_id,grade,subject_id  
                )   t1
        )   t2

我不能保证这是最好的写法,也许还有优化解,希望朋友们拿出来讨论。
如果我看到比较好的解决方案,一样会给分的。
发表于:2007-10-26 18:57:474楼 得分:0
追加问题:还是这个表。上面是有固定列数要求的行转列,用case语句实现了。如果没有固定列数要求,应该怎么实现啊?

现在纯属学习,征集各种解法。

谢谢!
发表于:2007-10-26 19:00:355楼 得分:0
yangxiao_jiang   东北大胖
的blog我看了,里面的解法得到的是只有一列的表,你把所有的字段都连成了一个字符串。
能不能优化一下,得到这样的结果啊:
school_id   grade   subject_1   subject_2   subject_3   falg   student_sum_1   student_sum_2   student_sum_3
s1                 1           a                   b                   c                   1         2                             1                         2
s1                 2           a                   b                                       0         1                             1  


快速检索

最新资讯
热门点击