近日在工作中,遇到乙個專案,需要將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中面部進行快速佈線
面部佈線的最重要目的是為了表情動畫。人物內心的各種不同的心裡活動,主要是通過面部表情反映出來。而面部變化最豐富的地方是眼部 眉毛 和口部,其他部位則相應的會受這兩部分的影響而變化。對於面部表情,必須把整個面部器官結合起來分析。單純的某一部分的表情不能夠準確表達人物的內心活動。清楚的分析面部肌肉的走向...