SQL 中如何對紀錄進行拆分

2022-03-07 22:53:08 字數 2195 閱讀 9157

近日在工作中,遇到乙個專案,需要將sql server中的紀錄拆分顯示,也就是將一條紀錄根據某種方式拆分成多條紀錄。比如說在某個帳單系統中,記帳時,按照常規方式按條記;出帳時,要以0.5每紀錄的方式進行拆分,即3元的帳單,要拆分成6條紀錄,每條0.5元,除金額外,其它字段保持不變。

這是個很有趣的問題,最簡陋的方法莫過於使用游標,一條紀錄一條紀錄的分析並插入。可是,如果紀錄數很多(比如上十萬條帳單),那肯定是一場惡夢。如何拆分才能使效率最佳化呢?我在網上搜尋了一下「sql 紀錄拆分」,竟然還真讓我找到了,他用的是join的方式達到拆分效果,看起來效率應該比游標高許多,不過對方是將varchar欄位用","分割進行拆分,我採取拿來主義的方法,對他的方法進行了修改,下面以上面說的帳單系統為例,細說一下:

設定乙個帳單基本值,此值即每條出帳紀錄的金額。在select中,將帳單的金額減去此基本值乘以乙個有限序列數i,其結果可用來表示第i條出帳單的剩餘金額,如果得數大於等於0,表示還有剩餘的金額,出帳紀錄有效;若是小於0,則意味著剩餘金額不足,出帳紀錄無效。有效的出帳紀錄中的金額自然等於帳單基本值,不過這裡面還有幾個問題:

1、這裡只考慮了帳單金額可以被帳單基本值整除的情況,這種情況下,假如帳單基本值是0.5元,自然是每條出帳單0.5元;而假若帳單是3.2元,帳單基本值是0.5元,那麼最後一條帳單紀錄肯定不是0.5元而是0.2元,所以還需要判斷一下剩餘金額是否大於0小於帳單基本值,如果是,則剩餘金額就是該條出帳單的金額。

2、有限的序列數i,如何產生有限序列數?方法很多,建立乙個臨時表(或者表變數),1、2、3、4、5……一條一條插入即可產生序列數啦。另乙個方法比較有趣,使用某個系統表中的紀錄做引子,產生序列數。

下面是sql示例:

declare

@basevalue

asint

--帳單基本值

set@basevalue=50

declare

@fee

table

(id 

intidentity(1

, 1), name 

varchar(32

), fee 

int, feetime 

datetime

)insert

into

@fee

values('

andy', 

300, 

'2007-01-01 10:22:42')

insert

into

@fee

values('

john', 

300, 

'2007-01-01 10:22:32')

insert

into

@fee

values('

lara', 

310, 

'2007-01-01 10:22:22')

insert

into

@fee

values('

philip', 

240, 

'2007-01-01 10:22:52')

declare

@tmp

table

(id 

intidentity(0

, 1), a 

int) 

--序列數表(必須從0開始)

insert

into

@tmp

(a)select

null

from

sys.columns 

--用系統表做引子,產生序列數

select

f.id, f.name, 

'fee'=

case

when

fee 

-@basevalue

*t.id 

>=

@basevalue

then

@basevalue

else

fee 

-@basevalue

*t.id

end,

feetime

from

@fee

asf 

inner

join

@tmp

ast 

onfee 

-@basevalue

*t.id 

>

0order

byf.id, t.id

如何對電氣產品進行拆分?

電氣產品中限制使用的物品一般都是些重金屬的東西,它們有著很大的危害性,這些有害物質對環境和工作人員都產生著很大的影響。在進行電氣產品機械拆分的過程中,工作人員必須採取安全防護措施。雖然,國際上和大多數國家都已經有了明文規定,但是在實際情況中,還存在著某些值得我們注意的問題,在進行有害物質檢測或者是 ...

python拆分 如何用Python進行片語拆分?

可以先split 做好特殊字元標記,儲存到臨時變數裡面,比如,元組,陣列,或者字典之類的 再遍歷上面的變數,拆分括號,用乙個特殊標記,標記括號裡面的內容,總之找到區分括號和非括號內容就可以,之後儲存到變數 最後遍歷第二個變數,生成句型 抱歉最近精神狀態不太好,又比較忙,今天大概寫了下,應該沒有啥問題...

如何對ZBrush中面部進行快速佈線

面部佈線的最重要目的是為了表情動畫。人物內心的各種不同的心裡活動,主要是通過面部表情反映出來。而面部變化最豐富的地方是眼部 眉毛 和口部,其他部位則相應的會受這兩部分的影響而變化。對於面部表情,必須把整個面部器官結合起來分析。單純的某一部分的表情不能夠準確表達人物的內心活動。清楚的分析面部肌肉的走向...