iT邦幫忙

0

玩玩SQL~將備註敘述裡面的數字縮零調整~求SQL改善

sql
  • 分享至 

  • xImage

恩~有個縮零需求,也就所有的數字都要往後退後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都可以~如下圖顯示~
https://ithelp.ithome.com.tw/upload/images/20250419/20061369AhUQqUCdtL.png

目前我最佳方式只有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

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
一級屠豬士
iT邦大師 1 級 ‧ 2025-04-19 01:03:24
最佳解答

按我前往

這樣試試看

喔~所以你建議用function處理~
看起來這樣比較簡單了~
應該純SQL轉換不行~

那我也改function處理吧~

我的建議是,問問看為了什麼原因要這樣做.有時候都是一些意想不到的原因.

他那個防被商業間諜知道真正的數字吧~
我那個範例也是亂想去打的~
畢竟要練習SQL當然要想一下範例資料囉

我要發表回答

立即登入回答