这个sql语句比较长~
这段语句在oracle中能正常运行,现在要改成能在sql server中运行,不知道需要改哪些地方,请高手多加指教,可以的话,帮忙写出来,谢谢             select  com_Cd,
       FN_GET_ACC_CODE_NM(#argComCd#,'A902',#argAcctUn#) un_nm,
       FN_GET_ACC_CODE_NM(#argComCd#, 'A901', #acctCD# ) AS acct_Nm_ext,
                        st_Acct_Cd,
        max(acct_struc_nm) st_Acct_Nm,
        max(acct_dt) acct_Dt,
        max(acct_sq) acct_Sq,
        case when cnt = 0  then max(ds)||' : ['||max(acct_struc_nm)||']' 
             else max(ds)
        end as ds,
        yyyymm acctYm,
        case when cnt in (0,1,2)  then sum(dr_am)
             else sum(sum(dr_am)) over(partition by com_cd,st_acct_cd  order by yyyymm)
        end as dr_Am,
        case when cnt in (0,1,2)  then sum(cr_am)
             else sum(sum(cr_am)) over(partition by com_cd,st_acct_cd  order by yyyymm)
        end  as cr_Am,

        
                      case when cnt=0  then max(rm_am)
                             when cnt=1  and  max(stnd_dr_cr_cl) ='1' then
                                (sum(sum(dr_am)) over(partition by com_cd,slip_no  order by yyyymm)-
                                sum(sum(cr_am)) over(partition by com_cd,slip_no  order by yyyymm))
                             when cnt=1  and  max(stnd_dr_cr_cl) ='2' then
                                (sum(sum(cr_am)) over(partition by com_cd,slip_no  order by yyyymm)-
                                sum(sum(dr_am)) over(partition by com_cd,slip_no  order by yyyymm))
                  
             when cnt=2  then  
                  (sum(sum(dr_am)) over(partition by com_cd,yyyymm  order by yyyymm)-
                      sum(sum(cr_am)) over(partition by com_cd,yyyymm  order by yyyymm))
             when cnt=3 then 
                            (
                             sum(sum(dr_am)) over(partition by com_cd,st_acct_cd  order by yyyymm)-
                   sum(sum(cr_am)) over(partition by com_cd,st_acct_cd  order by yyyymm))
                 
        end as rm_Am,
        case when cnt=0  then 'A'
                             when cnt=1 then 
                           
                                max(max('B')) over(partition by com_cd,slip_no  order by yyyymm)
                  
             when cnt=2  then  'D'
                  
             when cnt=3 then   'E'
         end as rm_Am_loc,
                             
        max(acct_cd) acct_Cd,
        max(acct_nm) acct_Nm,
        slip_No,
        max(mng_item1) mng_item1,
                         case when cnt in (0,1,2)  then sum(cr_am)
             else sum(sum(cr_am)) over(partition by com_cd,st_acct_cd  order by yyyymm)
        end  as cr_Am,
        max(stnd_dr_cr_cl) stnd_dr_cr_cl,
        
        cnt
       
from

        
select  a.com_cd com_cd,  a.acct_cd st_Acct_Cd, b.acct_struc_nm acct_struc_nm, null acct_dt, null acct_sq ,
          '[上月结转]' as ds, substr(#argAcctBgnDt#,1,6) yyyymm, substr(#argAcctBgnDt#,1,4)||'00' yyyymm1,
          0 dr_am,  0 cr_am, a.mbgn_am rm_am, 
           a.acct_cd acct_cd, null acct_nm, null slip_no,
          null mng_item1,
         
          b.stnd_dr_cr_cl stnd_dr_cr_cl,
          0 cnt    
  from  
      
                         (select max(com_cd) com_cd, max(acct_un) acct_un,max(acct_ym) acct_ym,sum(mbgn_am) mbgn_am,acct_cd as acct_cd from acg_acctsum_m 
                         where acct_ym=substr(#argAcctBgnDt#,1,6) 
                         and acct_cd  in
                         (
                         
                            select    acct_cd acct_cd
                    from v_acg_mngitemsum_d_01
                   where 
                             com_cd  = #argComCd#   
                     and acct_un like decode(#argAcctUn#,'000','','100')||'%' and acct_ym = substr(#argAcctBgnDt#,1,6) 
                     and mng_item_cd2 = #argMngItemCd1#   and nvl(mng_item_vl2,' ') like #argMngItemVl1#||'%'
                         ) 
                         and com_cd=#argComCd#
                         and acct_un=#argAcctUn#
                         and acct_cd like #acctCD#||'%'
                         group by acct_ym,acct_cd
                         ) a,
         (
                         select a.com_cd com_cd, a.acct_struc_cd acct_struc_cd, a.acct_struc_nm, b.stnd_dr_cr_cl  stnd_dr_cr_cl 
          from aci_acctstruc_i a, aci_acctcode_c b
         where a.com_cd=b.com_cd  and a.acct_cd=b.acct_cd
           and a.com_cd=#argComCd# and a.app_yy= substr(#argAcctBgnDt#,1,4)) b      
           
        where  a.com_cd=b.com_cd
        and  a.acct_cd=b.acct_struc_cd 
                 
     
union all     
   select  a.com_cd com_cd, a.st_acct_cd st_acct_cd, b.acct_struc_nm acct_struc_nm, 
           decode(a.slip_no,null,null,a.acct_dt)  acct_dt,
           decode(a.slip_no,null,null,a.acct_sq)  acct_sq ,
           case when a.slip_no is not null  then a.ds
                when a.yyyymm2   is not null  then '[月        计]'
                
           end  as ds,
           decode(a.slip_no,null,a.yyyymm1,null) yyyymm, a.yyyymm1 yyyymm1,
           decode(a.yyyymm2,null,0,a.dr_am) dr_am,
           decode(a.yyyymm2,null,0,a.cr_am) cr_am,
           a.rm_am rm_am, 
           decode(a.slip_no,null,null,a.acct_cd) acct_cd,
           decode(a.slip_no,null,null,a.acct_nm) acct_nm,
           a.slip_no slip_no,
           decode(a.slip_no,null,null,a.mng_item1) mng_item1,
         
           b.stnd_dr_cr_cl stnd_dr_cr_cl,
           case when a.slip_no is not null  then 1
                when a.yyyymm2   is not null  then 2
               
           end as cnt

    from
       (  select a.com_cd com_cd, b.st_acct_cd st_acct_cd,  max(a.acct_dt) acct_dt, max(a.acct_sq) acct_sq, max(a.ds) ds,
                a.yyyymm1 yyyymm1, b.st_acct_cd||a.yyyymm1 yyyymm2, sum(a.dr_am) dr_am, sum(a.cr_am) cr_am, sum(a.rm_am)  rm_am, 
                a.slip_no_sq  slip_no, max(a.acct_cd) acct_cd, max(b.acct_nm) acct_nm, max(mng_item1) mng_item1
           from
              ( select   a.com_cd com_cd, b.slip_no slip_no, b.slip_sq slip_sq,  a.acct_dt acct_dt, a.acct_sq acct_sq, 
                           b.ds ds, substr(a.acct_dt,1,6) as yyyymm1,
                           decode(b.dr_cr_cl,'1',b.am,0) dr_am, decode(b.dr_cr_cl,'2',b.am,0) cr_am, 0  rm_am,
                           (b.slip_no||lpad(b.slip_sq,5,0)) slip_no_sq, b.acct_cd acct_cd, 
                           trim(b.mng_item_vl_nm2) mng_item1
                         
                  
                    from acg_slip_h a, v_acg_acctmngitem_d_01 b
                   where a.com_cd=b.com_cd 
                     and a.slip_no=b.slip_no
                     and a.com_cd  = #argComCd#   and a.acct_dt >= #argAcctBgnDt#||'01' and a.acct_dt <=  #argAcctEndDt#||'31' and a.slip_st='99'
                     and a.acct_un like decode(#argAcctUn#,'000','',#argAcctUn#)||'%' 
                     and b.mng_item_cd2 = #argMngItemCd1#   and nvl(b.mng_item_vl2,' ') like #argMngItemVl1#||'%'
                          ) a, 
           
             (  select com_cd, acct_cd, acct_struc_nm acct_nm, 
                       decode('1','1',acct_lv4_cd,'2',acct_lv3_cd,'3',acct_lv2_cd,'4',acct_lv1_cd) st_acct_cd
                  from aci_acctstruc_i 
                 where com_cd = #argComCd# and app_yy =  substr(#argAcctBgnDt#,1,4) and acct_struc_cd like #acctCD#||'%') b
             
           where a.com_cd = b.com_cd and a.acct_cd = b.acct_cd 
           group by ROLLUP(a.com_cd, b.st_acct_cd, a.yyyymm1, b.st_acct_cd||a.yyyymm1, a.slip_no_sq) 
           having a.yyyymm1 is not null ) a,
         
       ( select a.com_cd com_cd, a.acct_struc_cd acct_struc_cd, a.acct_struc_nm, b.stnd_dr_cr_cl  stnd_dr_cr_cl 
             from aci_acctstruc_i a, aci_acctcode_c b
             where a.com_cd=b.com_cd  and a.acct_cd=b.acct_cd and a.com_cd = #argComCd# and a.app_yy = substr(#argAcctBgnDt#,1,4)) b  
             where  a.com_cd=b.com_cd
             and  a.st_acct_cd=b.acct_struc_cd    
             and a.yyyymm2 is not null
             union all 
                      select  '' com_cd, '' st_acct_cd, '' acct_struc_nm, 
              ''  acct_dt,
              ''  acct_sq ,
            '[累        计]' ds,
            '' yyyymm,
                           '' yyyymm1,
            0 dr_am,
            0 cr_am,
            0 rm_am, 
            '' acct_cd,
            '' acct_nm,
            '' slip_no,
           '' mng_item1,
         
           stnd_dr_cr_cl stnd_dr_cr_cl,
           3 cnt
                   from aci_acctcode_c
                   where 
                  com_cd=#argComCd# 
                  and acct_cd= #acctCD#
     )
  
  group by com_cd, st_acct_cd,  yyyymm1, cnt, slip_no, yyyymm 
  order by com_cd, yyyymm1,acct_cd,   cnt, acct_dt, acct_sq, slip_no

解决方案 »

  1.   

    太长了,你写的短一点的SQL自己测一下吧??
      

  2.   

    我觉得你还是把需求整理一下,去sqlserver里面写个新的更靠普,谁会去研究你这么大一堆脚本
      

  3.   


    脚本太长了,你用了很多oracle的分析函数,所以要改的地方太多了,建议根据业务逻辑用sqlserver的方式重新写下好了吧!
      

  4.   

    你使用了oracle中的许多函数,尤其是分析函数。在sql server中是没有的,所以你必须得手动修改这个SQL语句了。
      

  5.   

    楼主你应该把你认为碰到难题的地方SQL整理一下,抽象成若干点,甚至举出同等技术问题的例子.这么多代码人家阅读起来时很困难的.
      

  6.   

    1、substr要替换成substring
    2、|| 要替换成+
    3、decode要用case when实现
    4、trim 要用ltrim与rtrim结合实现
      

  7.   

    分析函数SQL Server 2005版本都已经有了,看了一下你只需要把decode改成case when
    || 改成 +
    substr 改成substring另外,你的SQL 里面还有几个oracle 自定义函数FN_,也许要一起改过来