表名texcel
字段:mat_code   mat_name, mat_amout,     add_time
值:   002         石灰      1212      20110308003834
       003         铁水      1333      20110308023834
       002         石灰      1555      20110308103834
       003         铁水      1777      20110308173834
       002         石灰      1888      20110308193834
       004         铝块      2123      20110308223834现在我根据add_time的时间段来区分了三个班组,甲,乙,丙
他们的时间段分别是'甲',时刻段是 '20110308000000' ~ '20110308075959'                                
                  '乙', 时刻段是 '20110308080000' ~ '20110308155959'   
                  '丙',时刻段是 '20110308160000' ~ '20110308235959' ;
然后我想根据三个班组来计算每个班组每个mat_name的mat_amout,该怎么些SQL啊?
(以下是我写的,为什么不对诶?)
 SELECT 
         (case when add_time between :v_add_time_beg AND :v_add_time_beg_end then v_prod_shift_group END) v_prod_shift_group,
         (case when add_time between :v_add_time_mid AND :v_add_time_mid_end then v_prod_shift_group END) v_prod_shift_group,
         (case when add_time between :v_add_time_end AND :v_add_time_end_end then v_prod_shift_group END) v_prod_shift_group,
         mat_code, mat_name,sum(mat_amount)
   FROM   texcel
   WHERE  add_time > :v_add_time_beg 
    AND   add_time < :v_add_time_end_end
   GROUP BY v_prod_shift_group,mat_code, mat_name;

解决方案 »

  1.   


    SQL> 
    SQL> with texcel as
      2  (
      3    select '002' mat_code,'石灰' mat_name,1212 mat_amount,20110308003834 add_time from dual union all
      4    select '003' mat_code,'铁水' mat_name,1333 mat_amount,20110308023834 add_time from dual union all
      5    select '002' mat_code,'石灰' mat_name,1555 mat_amount,20110308103834 add_time from dual union all
      6    select '003' mat_code,'铁水' mat_name,1777 mat_amount,20110308173834 add_time from dual union all
      7    select '002' mat_code,'石灰' mat_name,1888 mat_amount,20110308193834 add_time from dual union all
      8    select '004' mat_code,'铝块' mat_name,2123 mat_amount,20110308223834 add_time from dual
      9  )
     10  select groupname, mat_name, sum(mat_amount)
     11    from (select t.*,
     12                 case
     13                   when add_time between 20110308000000 and 20110308075959 then
     14                    '甲'
     15                   when add_time between 20110308080000 and 20110308155959 then
     16                    '乙'
     17                   when add_time between 20110308160000 and 20110308235959 then
     18                    '丙'
     19                   else
     20                    null
     21                 end groupname
     22            from texcel t)
     23   group by groupname, mat_name
     24  ;GROUPNAME MAT_NAME SUM(MAT_AMOUNT)
    --------- -------- ---------------
    丙        石灰                1888
    甲        铁水                1333
    丙        铁水                1777
    丙        铝块                2123
    甲        石灰                1212
    乙        石灰                15556 rows selectedSQL> 
      

  2.   

    sum(case when add_time between :v_add_time_beg AND :v_add_time_beg_end  then v_prod_shift_group else 0 END) v_prod_shift_group,
    加上sum和else 0看看