2011-07-22 63 views
0

列生成序列我有一個帳戶日記帳分錄表中的數據是這樣的:SQL爲一組取決於選擇的標準

TxnID VchNo SeqNo  Date AccountName    TxnAmt CrDr 
103931 0  0  1-Apr-2011 ADVERTISEMENT    3600 D 
103932 0  0  1-Apr-2011 MAYA OUTDOOR ADVERTISING  3600 C 
103933 0  0  1-Apr-2011 NILESH BRANKS    850500 D 
103934 0  0  1-Apr-2011 T.D.S ON CONTRACT A/C  45600 C 
103935 0  0  1-Apr-2011 CHEQUE A/C     185000 C 
103936 0  0  1-Apr-2011 PROFESSIONAL CHARGES  619900 C 
103937 0  0  1-Apr-2011 ADVERTISEMENT (HOARDING) 77210 C 
103938 0  0  1-Apr-2011 A111 COMMUNICATIONS   77210 D 
103939 0  0  1-Apr-2011 SALARY A/C     55500 D 
103940 0  0  1-Apr-2011 T JOHN      25000 C 
103941 0  0  1-Apr-2011 PHILIPS      30500 C 

TxnAmt可能是信貸(C)或借記(d)。請注意,對於TxnID 103931和103932,借記和貸記均被廢止。對於那些我想生成一個唯一的VchNo(憑證號)的對,分別用序號1和2來表示101。
對於TxnID 103933,存在借方金額(850500),其等於信用金額TxnID 103934,103935和103936(45600 + 185000 + 619900)。我想設置VchNo作爲102爲這些帶有序列號1,2,3,4分別交易如下面的結果集中示出:

TxnID VchNo SeqNo  Date AccountName    TxnAmt CrDr 
103931 101  1  1-Apr-2011 ADVERTISEMENT    3600 D 
103932 101  2  1-Apr-2011 MAYA OUTDOOR ADVERTISING  3600 C 
103933 102  1  1-Apr-2011 NILESH BRANKS    850500 D 
103934 102  2  1-Apr-2011 T.D.S ON CONTRACT A/C  45600 C 
103935 102  3  1-Apr-2011 CHEQUE A/C     185000 C 
103936 102  4  1-Apr-2011 PROFESSIONAL CHARGES  619900 C 
103937 103  1  1-Apr-2011 ADVERTISEMENT (HOARDING) 77210 C 
103938 103  2  1-Apr-2011 A111 COMMUNICATIONS   77210 D 
103939 104  1  1-Apr-2011 SALARY A/C     55500 D 
103940 104  2  1-Apr-2011 T JOHN      25000 C 
103941 104  3  1-Apr-2011 PHILIPS      30500 C 

呈現第一憑證序列號爲101,我想更新如上所示的VchNo和SeqNo。 請幫助我實現這一目標。

+0

我看到'937和'938的交易順序不同。 「939」,「940」和「941」根本不相加。如果'934已經是'45500'(即減少100),'934','935和'936是否仍然與'933?你的例子中有很多信息組合不明顯。 –

+0

請更正您的測試數據 –

+0

現在數據已更正。請幫助實現結果。 – Nagesh

回答

2

可以使用CTE(公用表表達式)與ROW_NUMBERPARTITION BY子句:

;WITH YourData AS 
(SELECT 
    (list of columns), 
    ROW_NUMBER() OVER(PARTITION BY VchNo ORDER BY TxnID DESC) AS 'SeqNo') 
FROM 
    dbo.YourTable 
WHERE (condition) 
) 
SELECT * 
FROM YourData 

基本上,CTE由VchNo劃分用戶數據 - 即,每個VchNo定義數據的「分區」。 ROW_NUMBER函數將按順序對所有行進行編號,從每個分區中的每個行開始。

剛剛重讀你的問題,似乎你沒有一個VchNo值開始.....我不完全明白你是如何創建你的VchNo - 這些需要基於一些標準,我也沒有看到原始數據中的任何東西可以「保留」這些值......

但是,您可以在單個CTE中創建兩個ROW_NUMBER函數,或者您可能需要執行第一個CTE用於確定VchNo,第二個用於確定基於來自第一CTE的VchNoSeqNo

+0

對不起,沒有迴應,最近10小時沒有上網。我編輯了測試數據。 – Nagesh

+0

你應該按TxnID進行排序,因爲日期似乎對於所有行都是一樣的 –

+0

@Nagesh:我還是沒有看到你如何保持一個「C」和「D」項......你怎麼知道哪些永遠在一起??他們是否共享某種共同的列? –