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

 


    本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2009/11/04/1595812.html,如需转载请自行联系原作者


相关文章
|
5月前
|
SQL
SQL如何将一个列中值内的逗号分割成另一列
本文介绍了在 SQL Server 中如何将一个列中的逗号分隔值拆分成多列。通过使用 `REVERSE` 和 `PARSENAME` 函数组合,实现对地址字符串的拆分,分别提取出街道、城市和州信息。适用于处理类似结构化文本数据的场景,提升数据查询与分析效率。
|
9月前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
7月前
|
SQL 存储 大数据
Dataphin V5.0:支持创建异步调用API,实现慢 SQL 复杂计算的直连消费
本文介绍了数据服务产品中异步调用的应用场景与优势,包括大数据引擎查询、复杂SQL及大规模数据下载等场景,解决了同步调用可能导致的资源浪费和性能问题。通过创建异步API、测试发布以及权限申请等功能,实现高效稳定的服务提供。以电商订单查询为例,展示了如何利用异步调用提升系统性能与用户体验。
283 9
|
SQL 存储 数据库
SQL部分字段编码设置技巧与方法
在SQL数据库管理中,设置字段的编码对于确保数据的正确存储和检索至关重要
|
SQL 存储 Serverless
SQL语句拆分时间字段的技巧与方法
在数据库操作中,经常需要处理时间数据
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
3022 5
|
SQL 存储 缓存
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理和分析中,经常需要计算某个班级在特定科目上的平均分
|
SQL 存储 并行计算
Lindorm Ganos 一条 SQL 计算轨迹
Lindorm Ganos 针对轨迹距离计算场景提供了内置函数 ST_Length_Rows,结合原生时空二级索引和时空聚合计算下推技术,能够高效过滤数据并并行执行运算任务。该方案通过主键索引和时空索引快速过滤数据,并利用多Region并行计算轨迹点距离,适用于车联网等场景。具体步骤包括根据车辆识别代码和时间戳过滤数据、范围过滤轨迹点以及并行计算距离。使用限制包括只支持点类型列聚合运算及表中轨迹点需按顺序排列等。测试结果显示,Lindorm Ganos 在不同数据量下均能实现秒级响应。
154 3
SQL开发问题之当从数据源读取多个字段时优化 COUNT(DISTINCT ...) 的查询的问题如何解决
SQL开发问题之当从数据源读取多个字段时优化 COUNT(DISTINCT ...) 的查询的问题如何解决
268 7