2012-03-05 111 views
0

SQL Server 2008的合併記錄 - TSQL

我有一個問題,我有兩個,我想合併到一起同一賬戶,列表看起來象下面這樣:

AcctID AcctType AcctSubType Curr TransType Amount 
1  CCY  SET   EUR Opening 1000 
1  CCY  SET   EUR BUY  -100 
1  CCY  SET   EUR SEL  100 
1  CCY  SET   EUR Closing 1000 
2  CCY  SET   EUR Opening 2000 
2  CCY  SET   EUR SEL  100 
2  CCY  SET   EUR Closing 2100 
3  CCY  INC   EUR Opening 1000 
3  CCY  INC   EUR SEL  200 
3  CCY  INC   EUR BUY  -100 
3  CCY  INC   EUR Closing 1100 

所以基本上我想合併它,所以它看起來是這樣的:

AcctID AcctType AcctSubType Curr TransType Amount 
1  CCY  SET   EUR Opening 3000 
1  CCY  SET   EUR BUY  -100 
1  CCY  SET   EUR SEL  100 
2  CCY  SET   EUR SEL  100 
1  CCY  SET   EUR Closing 3100 
3  CCY  INC   EUR Opening 1000 
3  CCY  INC   EUR SEL  200 
3  CCY  INC   EUR BUY  -100 
3  CCY  INC   EUR Closing 1100 

但是我想不出在我的存儲過程中用SQL編寫這個代碼的最佳方式。我只能真正想到合併或聯合,但我只希望它合併在有兩個資本賬戶的地方,資本賬戶由'CCY'AcctType和AcctSubType'SET'表示。

一個正確的方向點將不勝感激。

感謝

編輯:實際存儲過程

CREATE TABLE #Workbook 
(ID INT 
,PortfolioID VARCHAR(20) 
,PortfolioName VARCHAR(255)  
,InstrumentID VARCHAR(20) 
, IssueID     VARCHAR(50) 
, CashAccountInstrumentID VARCHAR(20) 
, CashAccountName   VARCHAR(255) 
, CashAccountType   CHAR(3) 
, CashAccountSubType  CHAR(3) 
, TransactionClass  VARCHAR(10) 
, TransactionType   VARCHAR(20) 
, EffPostDate    DATETIME 
, TradeDate    DATETIME 
, SettleDate    DATETIME 
, CcySettle    VARCHAR(3) 
, DateItem    DATETIME 
, RunningTotalDate  DATETIME 
, Detail     VARCHAR(300) 
, ProceedsLocal   FLOAT 
, Total     FLOAT 
, RunningTotal   FLOAT 
, ReconValue    FLOAT 
, ReconNotes    VARCHAR(50) 
, RecordType    VARCHAR(1) 
, Sequence    INT 
, RecordNum    INT 
, TransactionID   VARCHAR(20) 
) 

INSERT INTO #Workbook 
EXEC dbo.usp_Generic_ReconCashAccount_NEW '2010-10-01', '2010-10- 07', '', 'OOGENHF', 'SS','','','','','' 

DELETE FROM #Workbook 
WHERE TransactionType = 'BBA' 
OR (ProceedsLocal = 0 AND RecordType = 'T') 
;;with needed as 
(
select * from #Workbook w 
WHERE w.CashAccountType = 'CCY' 
AND w.CashAccountSubType = 'SET' 
AND w.TransactionType In ('Opening','Closing') 
AND w.CcySettle = w.CcySettle 
) 
select 
    min(ID) 
, PortfolioID 
, PortfolioName 
, InstrumentID 
, IssueID 
, min(CashAccountInstrumentID) as CashAccountInstrumentID 
, min(CashAccountName) as CashAccountName 
, CashAccountType 
, CashAccountSubType 
, TransactionClass 
, TransactionType 
, EffPostDate 
, TradeDate 
, SettleDate 
, CcySettle 
, DateItem 
, RunningTotalDate 
, Detail 
, sum(ProceedsLocal) as ProceedsLocal 
, sum(Total) as Total 
, sum(RunningTotal) as RunningTotal 
, sum(ReconValue) as ReconValue 
, ReconNotes 
, RecordType 
, Sequence 
, RecordNum 
, TransactionID 
from needed 
group by  ID,PortfolioID,PortfolioName,InstrumentID,IssueID,CashAccountInstrumentID,CashAccountName,CashAccountType,CashAccountSubType,TransactionClass,TransactionType,EffPostDate,TradeDate,SettleDate 
,CcySettle, DateItem,RunningTotalDate,Detail,ProceedsLocal,Total,RunningTotal,ReconValue,ReconNotes,RecordType,Sequence,RecordNum,TransactionID 

UNION ALL 
(
select * from #Workbook 
except 
select * from needed 
) 
drop table #Workbook 
+0

您不應該在GROUP BY上使用聚集(即MIN或SUM)的列。 – Johan 2012-03-07 13:36:42

回答

1

如何:

;with test (AcctID, AcctType, AcctSubType, Curr, TransType, Amount) 
as 
(
select 1, 'CCY', 'SET', 'EUR', 'Opening', 1000 
union all 
select 1, 'CCY', 'SET', 'EUR', 'BUY', -100 
union all 
select 1, 'CCY', 'SET', 'EUR', 'SEL', 100 
union all 
select 1, 'CCY', 'SET', 'EUR', 'Closing', 1000 
union all 
select 2, 'CCY', 'SET', 'EUR', 'Opening', 2000 
union all 
select 2, 'CCY', 'SET', 'EUR', 'SEL', 100 
union all 
select 2, 'CCY', 'SET', 'EUR', 'Closing', 2100 
union all 
select 3, 'CCY', 'INC', 'EUR', 'Opening', 1000 
union all 
select 3, 'CCY', 'INC', 'EUR', 'SEL', 200 
union all 
select 3, 'CCY', 'INC', 'EUR', 'BUY', -100 
union all 
select 3, 'CCY', 'INC', 'EUR', 'Closing', 1100 
union all 
select 4, 'CCY', 'SET', 'SEK', 'Opening', 2000 
union all 
select 4, 'CCY', 'SET', 'SEK', 'SEL', 100 
union all 
select 4, 'CCY', 'SET', 'SEK', 'Closing', 2100 
) 
, needed as 
(
select * 
from test 
where AcctType = 'CCY' 
    and AcctSubType = 'SET' 
    and TransType in ('Opening','Closing') 
) 
select min(AcctID) as AcctID 
     ,AcctType 
     ,AcctSubType 
     ,Curr 
     ,TransType 
     ,sum(Amount) as Amount 
from needed 
group by 
     AcctType 
     ,AcctSubType 
     ,Curr 
     ,TransType 
union all 
( 
    select * 
    from test 
    except 
    select * 
    from needed 
) 

編輯:更新,可支持多種currencys。

唯一的變化是將最終的SELECT - EXCEPT包裝在禁忌中。

+0

這非常有幫助。現在是如此接近,但是在需要的表格中,我只需要打開和關閉CCY和SET超過1個AcctID的地方。任何想法如何實現? – 2012-03-06 09:35:53

+0

這非常有幫助。現在是如此接近,但是在需要的表格中,我只需要打開和關閉CCY和SET超過1個AcctID的地方。任何想法如何實現? – 2012-03-06 09:36:23

+0

你怎麼知道哪些是重複的? – Johan 2012-03-06 10:12:42