select *
from bmb
---------
--仓库分类 产品名称 单位 核算分类
--床扎销子 1#床扎 付 定单五金
--床扎销子 3#床扎 付 Null
--螺丝螺母 加大垫圈6mm(黑) 千件 定单五金
--螺丝螺母 8mm古铜垫片 千件 Null
--电工电器 交流电磁开关HKO-11 只 本厂维修
--电工电器 交流电磁开关HKO-35 只 Null--×××需求:
--通过【仓库分类】循环update 【核算分类】里的 null,当【仓库分类】is null 时跳过。---以前方法,不能够循环
select top 1 *
from bmb
where 核算分类 is null
--
update bmb
set 核算分类='定单五金'
where 仓库分类 = '床扎销子' and 核算分类 is null
from bmb
---------
--仓库分类 产品名称 单位 核算分类
--床扎销子 1#床扎 付 定单五金
--床扎销子 3#床扎 付 Null
--螺丝螺母 加大垫圈6mm(黑) 千件 定单五金
--螺丝螺母 8mm古铜垫片 千件 Null
--电工电器 交流电磁开关HKO-11 只 本厂维修
--电工电器 交流电磁开关HKO-35 只 Null--×××需求:
--通过【仓库分类】循环update 【核算分类】里的 null,当【仓库分类】is null 时跳过。---以前方法,不能够循环
select top 1 *
from bmb
where 核算分类 is null
--
update bmb
set 核算分类='定单五金'
where 仓库分类 = '床扎销子' and 核算分类 is null
update bmb set 核算分类=@h,@h=isnull(@h,核算分类)
insert bmb select '床扎销子', '1#床扎', '付' , '定单五金'
insert bmb select '床扎销子', '3#床扎', '付' , Null
insert bmb select '螺丝螺母', '加大垫圈6mm(黑)' , '千件' , '定单五金'
insert bmb select '螺丝螺母', '8mm古铜垫片' , '千件' , Null
insert bmb select '电工电器', '交流电磁开关HKO-11' , '只' , '本厂维修'
insert bmb select '电工电器', '交流电磁开关HKO-35' , '只' , Nulldeclare @h varchar(20)
update bmb set 核算分类=@h,@h=isnull(核算分类,@h)select * from bmbdrop table bmb仓库分类 产品名称 单位 核算分类
-------------------- -------------------- ---------- --------------------
床扎销子 1#床扎 付 定单五金
床扎销子 3#床扎 付 定单五金
螺丝螺母 加大垫圈6mm(黑) 千件 定单五金
螺丝螺母 8mm古铜垫片 千件 定单五金
电工电器 交流电磁开关HKO-11 只 本厂维修
电工电器 交流电磁开关HKO-35 只 本厂维修(6 行受影响)
所有记录数有2万多,现在发现一些新情况,单独靠通过【仓库分类】对应的【核算分类】是判断更新的空值有些情况下是错误的。
而是需要通过【存货编码】列里的部分字符串对应的非空【核算分类】来判断更新【核算分类】空值
部分字符串有这样的规律,是全数字型的取前3位,数字字母混合的取字母,具体如【辅助列】。
在excel里面可以通过函数取出辅助列,然后筛选辅助列拖拽核算分类列来完成。
实例数据:
存货代码 辅助列 仓库分类 产品名称 单位 核算分类
0012389 001 纸箱 KP84QS-PS52-2-2 只 null
0012390 001 纸箱 QS727PS727-3-2 只 纸箱
0012392 001 纸箱 KS727QS727-3-1 只 null
0012393 001 纸箱 KS727QS727-3-2 只 null
0012394 001 纸箱 QS727QS727-3-1 只 纸箱
H189 H 螺丝螺母 8.5*28*20垫片 只 null
H187 H 螺丝螺母 弹簧垫片5mm 千件 订单五金
DG0819 DG 电工电器 尼龙扎带300*5 根 维修
DG0820 DG 电工电器 尼龙扎带500*8 根 null
K317 K 刀具 V型刀1/4*2/8 把 null
K318 K 刀具 进口带锯条 根 工具
set 核算分类 = (select top 1 核算分类 from ta where 存货代码 like left(a.存货代码,case when ascii(a.存货代码)>=65 then 1 else 3 end)+'%' order by 核算分类 desc )
from ta a
where a.核算分类 is null
set 核算分类 = b.核算分类
from ta a,
(select *,t=left( 存货代码,case when ascii( 存货代码)>=65 then 1 else 3 end)
from ta
where 核算分类 is not null) b
where a.核算分类 is null and a.存货代码 like b.t+'%'
set 核算分类 = b.核算分类
from ta a,
(select *,t=left( 存货代码,case when ascii( 存货代码)<65 then 3 else ?? end)
'??一个是len(存货代码)里的字母,这些字母都在开始处'
from ta
where 核算分类 is not null) b
where a.核算分类 is null and a.存货代码 like b.t+'%'
'google到了,不会修改。
declare @a varchar(50)
set @a='2a p9 asdf1234ki 9'
while patindex('%[^a-z]%',@a)>0
begin
set @a=stuff(@a,patindex('%[^a-z]%',@a),1,'')
end
select @a
'
0012389
0012390
0012392
0012393
0012394
E35
H189
H187
DG0819
DG0820
K317
K318
B151
GC0655
GC0658
F787
JB-6
JL0330
JL0331
J140
J141
create function GetStr(@a varchar(50))
returns varchar(50)
as
begin
while patindex('%[^a-z]%',@a)>0
begin
set @a=stuff(@a,patindex('%[^a-z]%',@a),1,'')
end
return @a
end
go
select dbo.getstr('2a p9 asdf1234ki 9')
go
/*
--------------------------------------------------
apasdfki
*/
update a
set 核算分类 = b.核算分类
from ta a,
(select *,t=left( 存货代码,case when ascii( 存货代码)<65 then 3 else dbo.getstr(存货代码)
end)
--'??一个是len(存货代码)里的字母,这些字母都在开始处'
from ta
where 核算分类 is not null) b
where a.核算分类 is null and a.存货代码 like b.t+'%'