Объединение записей, соответствующих определенным критериям - TSQL - PullRequest
0 голосов
/ 05 марта 2012

SQL Server 2008

Привет

У меня проблема с двумя одинаковыми учетными записями, которые я хотел бы объединить, список выглядит следующим образом:

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 

1 Ответ

1 голос
/ 05 марта 2012

Как насчет этого:

;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
)

РЕДАКТИРОВАТЬ : Обновлено для поддержки нескольких токов.

Единственное изменение - заключить в окончательные значения SELECT - EXCEPT парантезы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...