zoukankan      html  css  js  c++  java
  • sql 字段分割 物流费计算

    问题:

    有一个字段 prozise  在行中 有些有一个  有些有2个,空格隔开  里面数字单位是毫米  
    求长
    **宽的结果 结果单位是立方米 
    结果放到prozise1字段中  两个的话 把第二个放到字段prozise2中 
      字段prozise部分数据如下: 
    1940*1050*135 
    990*730*120 
    990*730*120 
    870*500*50 
    870*500*50 
    1260*660*15            1305*670*76 
    1260*660*15            1305*670*76 
    1010*920*190            1940*1010*110 
    1010*920*190            1940*1010*110 
    1010*920*190            1940*1010*110 
    1010*920*190            1940*1010*110 
    1975*990*110          1940*1020*110 
    1975*990*110          1940*1020*110 

    解决:http:
    //topic.csdn.net/u/20091103/18/ba8f46db-b333-431c-8699-cd30427adbdf.html

     

    sql表结构:

    ID    
    int    
    name    
    varchar(255)    
    proid    
    varchar(255)    
    prosize    
    varchar(255)    
    prosize1    numeric(
    184)    
    prosize2    numeric(
    184)    
    huadong    numeric(
    184)    
    huanan    numeric(
    184)    
    huabei    numeric(
    184)    
    xibu_dongbei_huazhong    numeric(
    184)    
    huadong1    numeric(
    184)    
    huanan1    numeric(
    184)    
    huabei1    numeric(
    184)    
    xibu_dongbei_huazhong1    numeric(
    184)    
        

     

    参考:

    1.

    create table # (prozise varchar(100),prozise1 numeric(18,4),prozise2 numeric(18,4))
    insert #(prozise) select 
    '1940*1050*135' union all select  
    '990*730*120' union all select  
    '990*730*120' union all select  
    '870*500*50' union all select  
    '870*500*50' union all select  
    '1260*660*15 1305*670*76' union all select  
    '1260*660*15 1305*670*76' union all select  
    '1010*920*190 1940*1010*110' union all select  
    '1010*920*190 1940*1010*110' union all select  
    '1010*920*190 1940*1010*110' union all select  
    '1010*920*190 1940*1010*110' union all select  
    '1975*990*110 1940*1020*110' union all select  
    '1975*990*110 1940*1020*110' 
    go

    update a set
        prozise1 
    = cast(left(lvl1,charindex('*',lvl1)-1as money)/1000
                 
    *cast(left(stuff(lvl1,1,charindex('*',lvl1),''),
                         
    charindex('*',stuff(lvl1,1,charindex('*',lvl1),''),
                          
    charindex('*',stuff(lvl1,1,charindex('*',lvl1),'')))-1as money)/1000
                 
    *cast(right(lvl1,charindex('*',reverse(lvl1))-1as money)/1000,
        prozise2
    =case when lvl2 is null then null 
                     
    else
                        
    cast(left(lvl2,charindex('*',lvl2)-1as money)/1000
                        
    *cast(left(stuff(lvl2,1,charindex('*',lvl2),''),
                         
    charindex('*',stuff(lvl2,1,charindex('*',lvl2),''),
                          
    charindex('*',stuff(lvl2,1,charindex('*',lvl2),'')))-1as money)/1000
                        
    *cast(right(lvl2,charindex('*',reverse(lvl2))-1as money)/1000
                 
    end
    from # as a
        
    outer apply(
            
    select left(prozise,charindex(' ',prozise+' ')-1as lvl1,
                
    case when charindex(' ',prozise)>0 then
                         
    right(prozise,charindex(' ',reverse(prozise))-1)
                     
    else null end as lvl2
        ) 
    as b;
        

    select * from #;

    go
    drop table #

    /*
    prozise                                            prozise1                                prozise2
    -------------------------------------------------- --------------------------------------- ---------------------------------------
    1940*1050*135                                      0.2749                                  NULL
    990*730*120                                        0.0867                                  NULL
    990*730*120                                        0.0867                                  NULL
    870*500*50                                         0.0217                                  NULL
    870*500*50                                         0.0217                                  NULL
    1260*660*15 1305*670*76                            0.0124                                  0.0664
    1260*660*15 1305*670*76                            0.0124                                  0.0664
    1010*920*190 1940*1010*110                         0.1765                                  0.2155
    1010*920*190 1940*1010*110                         0.1765                                  0.2155
    1010*920*190 1940*1010*110                         0.1765                                  0.2155
    1010*920*190 1940*1010*110                         0.1765                                  0.2155
    1975*990*110 1940*1020*110                         0.2150                                  0.2176
    1975*990*110 1940*1020*110                         0.2150                                  0.2176

    (13 行受影响)



    */
     
     
    2.sql2005
    create table # (prozise varchar(50),prozise1 numeric(18,4),prozise2 numeric(18,4))
    insert #(prozise) select 
    '1940*1050*135' union all select  
    '990*730*120' union all select  
    '990*730*120' union all select  
    '870*500*50' union all select  
    '870*500*50' union all select  
    '1260*660*15 1305*670*76' union all select  
    '1260*660*15 1305*670*76' union all select  
    '1010*920*190 1940*1010*110' union all select  
    '1010*920*190 1940*1010*110' union all select  
    '1010*920*190 1940*1010*110' union all select  
    '1010*920*190 1940*1010*110' union all select  
    '1975*990*110 1940*1020*110' union all select  
    '1975*990*110 1940*1020*110' 
    go

    update a set
        prozise1
    =b.lvl1.value('(//v)[1]','money')/1000*b.lvl1.value('(//v)[2]','money')/1000
           
    *b.lvl1.value('(//v)[3]','money')/1000,
        prozise2
    =b.lvl2.value('(//v)[1]','money')/1000*b.lvl2.value('(//v)[2]','money')/1000
           
    *b.lvl2.value('(//v)[3]','money')/1000
    from # as a
        
    outer apply(
            
    select
                
    convert(xml,'<v>'+
                      
    replace(left(prozise,charindex(' ',prozise+' ')-1),
                              
    '*','</v><v>')+'</v>'as lvl1,
                
    case when charindex(' ',prozise)>0 then
                         
                       
    convert(xml,'<v>'+
                           
    replace(right(prozise,charindex(' ',reverse(prozise))-1),
                                
    '*','</v><v>')+'</v>')
                     
    else null end as lvl2

        ) 
    as b

    select * from #;
    go
    drop table #

    /*
    prozise                                            prozise1                                prozise2
    -------------------------------------------------- --------------------------------------- ---------------------------------------
    1940*1050*135                                      0.2749                                  NULL
    990*730*120                                        0.0867                                  NULL
    990*730*120                                        0.0867                                  NULL
    870*500*50                                         0.0217                                  NULL
    870*500*50                                         0.0217                                  NULL
    1260*660*15 1305*670*76                            0.0124                                  0.0664
    1260*660*15 1305*670*76                            0.0124                                  0.0664
    1010*920*190 1940*1010*110                         0.1765                                  0.2155
    1010*920*190 1940*1010*110                         0.1765                                  0.2155
    1010*920*190 1940*1010*110                         0.1765                                  0.2155
    1010*920*190 1940*1010*110                         0.1765                                  0.2155
    1975*990*110 1940*1020*110                         0.2150                                  0.2176
    1975*990*110 1940*1020*110                         0.2150                                  0.2176

    (13 行受影响)


    */
     
     
     
    --更新物流费
     
    UPDATE [wl].[dbo].[xx]
       
    SET  huadong=prosize1*200, huanan=prosize1*84.375,huabei=prosize1*240,xibu_dongbei_huazhong=prosize1*211.65

    UPDATE [wl].[dbo].[xx]
       
    SET  huadong1=prosize2*200, huanan1=prosize2*84.375,huabei1=prosize2*240,xibu_dongbei_huazhong1=prosize2*211.65
    where prosize2 is not null

    --更新体积(立方米)
    update a set
        prosize1 
    = cast(left(lvl1,charindex('*',lvl1)-1as money)/1000
                 
    *cast(left(stuff(lvl1,1,charindex('*',lvl1),''),
                         
    charindex('*',stuff(lvl1,1,charindex('*',lvl1),''),
                          
    charindex('*',stuff(lvl1,1,charindex('*',lvl1),'')))-1as money)/1000
                 
    *cast(right(lvl1,charindex('*',reverse(lvl1))-1as money)/1000,
        prosize2
    =case when lvl2 is null then null 
                     
    else
                        
    cast(left(lvl2,charindex('*',lvl2)-1as money)/1000
                        
    *cast(left(stuff(lvl2,1,charindex('*',lvl2),''),
                         
    charindex('*',stuff(lvl2,1,charindex('*',lvl2),''),
                          
    charindex('*',stuff(lvl2,1,charindex('*',lvl2),'')))-1as money)/1000
                        
    *cast(right(lvl2,charindex('*',reverse(lvl2))-1as money)/1000
                 
    end
    from xx as a
        
    outer apply(
            
    select left(prosize,charindex(' ',prosize+' ')-1as lvl1,
                
    case when charindex(' ',prosize)>0 then
                         
    right(prosize,charindex(' ',reverse(prosize))-1)
                     
    else null end as lvl2
        ) 
    as b;
        

    select * from xx

    go


    --SQL2005导出 excel 2003
    --
    新建excel表并且excel中建好sql对应的字段 
    --
    xx是表名
    insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:\wl.xls',sheet1$) select * from xx 



    --excel 2003导入sql2005 表tt中
    --
    不用新建表tt 
    SELECT * into tt
    FROM OpenDataSource'Microsoft.Jet.OLEDB.4.0',
      
    'Data Source="c:\wl.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')[Sheet1$]

    --实例:
    SELECT * into newtable
    FROM OpenDataSource'Microsoft.Jet.OLEDB.12.0',
      
    'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')xactions

  • 相关阅读:
    php生成excel
    gearmand
    开启Nginx的目录文件列表功能
    zend框架学习
    引用方法形成树
    智能指针实现
    图文例解C++类的多重继承与虚拟继承
    CC++定位崩溃代码行的方法
    C++函数重定义、重载、重写
    勤奋吧,一天一点,努力提高基本技能。
  • 原文地址:https://www.cnblogs.com/zengxiangzhan/p/1595812.html
Copyright © 2011-2022 走看看