求一存储过程,估计有点难度,如果成功了会加分的,请高手来解决一下,谢谢

 所属目录:Java   |   类型:技术问答   |   时间:2007-05-21
 问题:

表是这样的:  
      表1:  
   
  id                               name  
  01                                   a  
  02                                   b  
  03                                   c  
  0101                               a_a  
  0102                               a_b  
  0102                               a_c  
  0102001                         a_c_a  
  0101001                         a_a_a  
  0101002                         a_a_b  
  0201                               b_a  
  0201001                         b_a_a  
  0202                               b_b  
  0202002                         b_b_a  
  0301                               c_a  
  0301001                         c_a_a  
  ...  
   
  特征:a_a,a_b   是a的下一级,a_a_a是a_a的下一级,可以从id中看出规律来,b,c一样  
   
  表2:  
   
  id                         dates                     values1       values2  
   
  0301001               2005-1-1                   1                 2  
  0201001               2005-1-1                   2                 3  
  0301001               2005-1-2                   3                 4  
  0202002               2005-3-2                   4                 5  
  0101002               2005-2-3                   5                 6  
  0202002               2005-1-23                 6                 7  
  0102001               2005-2-1                   8                 9  
  0101001               2005-1-3                   9                 10  
  0101002               2005-4-5                   3                 54  
  0102002             2005-3-23                   5                 98  
  ...  
   
  表2   是随机插入的数据,但id是表存在的。已定好各级的id长度如表1  
   
  现要得到这样的结果:  
  数据可按各级进行汇总,汇总时还要进行排序,汇总方式有二种。如:选择汇总方式:一级和二级汇总,按values1的汇总值降序排列,汇总2005-1-1   到2005-3-3的数据  
  得到结果:  
        name1     name2         value0         values1       values2  
          c             c_a               1                       4                   6  
          c             小计             1                       4                     6  
          b             b_a               2                       2                     3  
          b             b_b               6                       10                   12  
          b             小计             8                       12                   15  
          a             a_c               0                       0                     0  
          a             a_b               8                       8                     9  
          a             a_a               14                     14                 16  
          a             小计             22                     22                   25  
         
  value0的值是各二级下属单位在该时间段内最早日期的数据汇总。  
  注意排序:以小计(即一级)为组,先按小计(即一级)中values1的大小排序,然后在二级里按values1的大小排序。看例子,因为c   的小计比b和a的小计都要小,所以c所有的数据要在上面。  
        汇总的方式还可以是,一级和三级,所以是可变的。  
   
  不知道大家看懂了没有,请大家帮我解决一下,要求是存储过程。谢谢,成功后会加分的。

· 网友精彩回答:

发表者:paoluo

这里,  
   
  0102                               a_b  
  0102                               a_c  
  0102001                         a_c_a  
   
  是不是有错误??  
   
  怎么会都为0102??  
   
   
  另外,为0的第二级也要统计出来,是吧。

发表者:filebat

楼主:我想基本上明白你要做什么了。  
  但是还有几个问题:  
  question1:表1中怎么会出现id相同而name不同的情况?  
  即如游鱼所说,   下面数据中是是否存在笔误?  
  0102                               a_b  
  0102                               a_c  
  question2:结果表中name2为a_a这一行的记录有问题吧  
  应该为  
        name1     name2         value0         values1       values2  
            a             a_a               9                     17               70  
  question3:我们可不可以假定表1中,   name列存在一个下划线,就表示一级?  
  即我想实际情况下name的值不可能只有a,   b,   c,   下划线组成。  
  可能是:食品_方便面_康师傅方便面   这类结构。所以我想问,如何从name的  
  值中看出级别关系。是不是可以假定下划线即为级别分隔符?

发表者:wozhuchuanwei

用这个应该可能解决问题  
  代码就自己写了吧  
   
  [   group   by   [   all   ]   group_by_expression   [   ,...n   ]  
                  [   with   {   cube   |   rollup   }   ]    
  ]  
  就是这两个参数   cube   |   rollup  
  你自己试试那一个是你要求的!  
   
 

发表者:paoluo

--建立测试环境  
  create   table   表1  
  (id varchar(10),  
    name varchar(10))  
   
  create   table   表2  
  (id varchar(10),  
    dates varchar(10),  
    values1 int,  
    values2 int)  
  --插入数据  
  insert   表1   values(01,                                   a)  
  insert   表1   values(02,                                   b)  
  insert   表1   values(03,                                   c)  
  insert   表1   values(0101,                               a_a)  
  insert   表1   values(0102,                               a_b)  
  insert   表1   values(0103,                               a_c)  
  insert   表1   values(0103001,                         a_c_a)  
  insert   表1   values(0102001,                         a_b_a)  
  insert   表1   values(0101001,                         a_a_a)  
  insert   表1   values(0101002,                         a_a_b)  
  insert   表1   values(0201,                               b_a)  
  insert   表1   values(0201001,                         b_a_a)  
  insert   表1   values(0202,                               b_b)  
  insert   表1   values(0202002,                         b_b_a)  
  insert   表1   values(0301,                               c_a)  
  insert   表1   values(0301001,                         c_a_a)  
   
  insert   表2   values(0301001,               2005-1-1,                   1,                 2)  
  insert   表2   values(0201001,               2005-1-1,                   2,                 3)  
  insert   表2   values(0301001,               2005-1-2,                   3,                 4)  
  insert   表2   values(0202002,               2005-3-2,                   4,                 5)  
  insert   表2   values(0101002,               2005-2-3,                   5,                 6)  
  insert   表2   values(0202002,               2005-1-23,                 6,                 7)  
  insert   表2   values(0102001,               2005-2-1,                   8,                 9)  
  insert   表2   values(0101001,               2005-1-3,                   9,                 10)  
  insert   表2   values(0101002,               2005-4-5,                   3,                 54)  
  insert   表2   values(0102002,               2005-3-23,                 5,                 98)  
  --测试  
  select   *   from   (  
  select    
  left(name,1)   as   name1,  
  left(name,3)   as   name2,  
  sum(values0)   as   values0,  
  sum(values1)   as   values1,  
  sum(values2)   as   values2    
  from    
  (select    
  a.name,  
  isnull(b.values1,0)   as   values0,  
  isnull(c.values1,0)   as   values1,  
  isnull(c.values2,0)   as   values2  
  from   表1   a  
  left   join    
  (select   id,min(values1)   as   values1   from   表2   where   dates   between   2005-1-1   and   2005-3-3   group   by   id   )   b  
  on   a.id=b.id  
  left   join    
  (select   id,sum(values1)   as   values1,sum(values2)   as   values2   from   表2   where   dates   between   2005-1-1   and   2005-3-3   group   by   id   )   c  
  on   a.id=c.id  
  where   len(a.id)=(select   max(len(id))   from   表1))   a  
  group   by   left(name,1),left(name,3)  
  with   rollup)   b  
  where   name1   is   not   null  
  --删除测试环境  
  drop   table   表1,表2  
  --结果  
  /*  
  name1 name2 values0 values1 values2  
  a a_a 14 14 16  
  a a_b 8 8 9  
  a a_c 0 0 0  
  a null 22 22 25  
  b b_a 2 2 3  
  b b_b 4 10 12  
  b null 6 12 15  
  c c_a 1 4 6  
  c null 1 4 6  
  */  
 

发表者:mengzulin

select   isnull(dbo.表1.name,   总计)   as   name1,   isnull(表1_1.name,    
              小计)   as   name2,   sum(dbo.表2.values1)   as   values1,   sum(dbo.表2.values2)    
              as   values2  
  from   dbo.表2   inner   join  
              dbo.表1   on   left(dbo.表2.id,   2)   =   dbo.表1.id   inner   join  
              dbo.表1   表1_1   on   left(dbo.表2.id,   4)   =   表1_1.id  
  where   (dbo.表2.dates   between   2005-1-1   and   2005-3-3)  
  group   by   dbo.表1.name,   表1_1.name   with   rollup  
  order   by   dbo.表1.name   desc,   表1_1.name   desc

.
处理 SSI 文件时出错
© 2006-2008 All Rights Reserved