恩~有個縮零需求,也就所有的數字都要往後退後1位
如果欄位是純數字~好處理~
但欄位是備註,裡面敘述的是數字如何調整呢?
註:原始資料不能改到,因為匯出資料時,數字都是正常的~
原始資料
工程款30000+額外費用5000=35000,另加交通費1000,合計:36000
外包120000-現場有工具5000=115000
特別助理15235+司機12500+特別補助5500=33235
縮零調整(網頁顯示用)
工程款3000+額外費用500=3500,另加交通費100,合計:3600
外包12000-現場有工具500=11500
特別助理1523.5+司機1250+特別補助550=3323.5
給初始資料
declare @Tmp table(
ID int
,SetDate date
,Memo nvarchar(max)
)
insert into @Tmp
values('1','2025/4/1',N'工程款30000+額外費用5000=35000,另加交通費1000,合計:36000')
,('2','2025/4/15',N'外包120000-現場有工具5000=115000')
,('3','2025/4/20',N'特別助理15235+司機12500+特別補助5500=33235')
任何SQL都可以~如下圖顯示~
目前我最佳方式只有T-SQL可以幫我處理疑難雜症...0.0a
附上T-SQL寫法~
declare @Tmp table(
ID int
,SetDate date
,Memo nvarchar(max)
)
insert into @Tmp
values('1','2025/4/1',N'工程款30000+額外費用5000=35000,另加交通費1000,合計:36000')
,('2','2025/4/15',N'外包120000-現場有工具5000=115000')
,('3','2025/4/20',N'特別助理15235+司機12500+特別補助5500=33235')
select *
from @Tmp
declare @ReTmp table(
ID int
,SetDate date
,Memo nvarchar(max)
)
declare @Count int=(select count(0) from @Tmp)
,@i int = 0
,@Memo nvarchar(max)
,@ID int
,@StrNumber nvarchar(50)
,@StrIndex int
,@StrLen int
,@StrMemo nvarchar(max)
,@TotalMemo nvarchar(max)
,@CalNum decimal(18, 1)
while(@i<@Count)
begin
set @i = @i + 1
select @ID=ID
,@Memo=Memo
from (
select Row_Number()over(order by ID) Sq
,ID
,Memo
from @Tmp
) k
where Sq = @i
set @StrNumber = ''
set @StrMemo = ''
set @TotalMemo = ''
set @StrLen = len(@Memo)
set @StrIndex = 1
while(@StrIndex>0)
begin
if(@StrIndex > @StrLen)
begin
if(@StrNumber != '')
begin
set @CalNum = Convert(decimal(18, 1),@StrNumber) / 10
if(Convert(decimal(18, 0),@CalNum) - @CalNum > 0)
begin
set @TotalMemo = @TotalMemo + @StrMemo + Convert(varchar,@CalNum) + substring(@Memo,@StrIndex,1)
end
else
begin
set @TotalMemo = @TotalMemo + @StrMemo + Convert(varchar,Convert(int,@CalNum)) + substring(@Memo,@StrIndex,1)
end
end
break
end
if(PatIndex('%[0-9]%',substring(@Memo,@StrIndex,1)) > 0)
begin
set @StrNumber = @StrNumber + substring(@Memo,@StrIndex,1)
end
else if(@StrNumber != '')
begin
set @CalNum = Convert(decimal(18, 1),@StrNumber) / 10
if(Convert(decimal(18, 0),@CalNum) - @CalNum > 0)
begin
set @TotalMemo = @TotalMemo + @StrMemo + Convert(varchar,@CalNum) + substring(@Memo,@StrIndex,1)
end
else
begin
set @TotalMemo = @TotalMemo + @StrMemo + Convert(varchar,Convert(int,@CalNum)) + substring(@Memo,@StrIndex,1)
end
set @StrMemo = ''
set @StrNumber = ''
end
else
begin
set @StrMemo = @StrMemo + substring(@Memo,@StrIndex,1)
end
set @StrIndex = @StrIndex + 1
end
print @TotalMemo
insert into @ReTmp
select ID
,SetDate
,@TotalMemo
from @Tmp
where ID=@ID
end
select *
from @ReTmp
這樣試試看