SQL 2008
В основном у меня есть набор данных, который выглядит следующим образом:
AcctID AcctType AcctSubType Curr TransType Amount Sequence
1 CCY SET EUR Opening 1000 B
1 CCY SET EUR BUY -100 T
1 CCY SET EUR SEL 100 T
1 CCY SET EUR Closing 1000 B
2 CCY SET EUR Opening 2000 B
2 CCY SET EUR SEL 100 T
2 CCY SET EUR Closing 2100 B
3 CCY INC EUR Opening 1000 B
3 CCY INC EUR SEL 200 T
3 CCY INC EUR BUY -100 T
3 CCY INC EUR Closing 1100 B
4 CCY SET GBP Opening 2000 B
4 CCY SET GBP SEL 100 T
4 CCY SET GBP Closing 2100 B
То, что я хочу сделать, это вернуть все из набора данных, где на одну валюту приходится более одного счета операций с капиталом (то есть, в основном, более одного отдельного AcctID). Счет операций с капиталом идентифицируется как AcctType = 'CCY' и AcctSubType = 'SET'. Также мне нужны только балансы, поэтому, где Sequence = 'B'.
Итак, для вышеуказанного набора данных будет возвращено следующее:
AcctID AcctType AcctSubType Curr TransType Amount Sequence
1 CCY SET EUR Opening 1000 B
1 CCY SET EUR Closing 1000 B
2 CCY SET EUR Opening 2000 B
2 CCY SET EUR Closing 2100 B
Я начал так, но запутался, как включить в валюту различное число AcctID, превышающее 1:
;;with test (AcctID, AcctType, AcctSubType, Curr, TransType, Amount, Sequence)
as
(
select 1, 'CCY', 'SET', 'EUR', 'Opening', 1000, 'B'
union all select 1, 'CCY', 'SET', 'EUR', 'BUY', -100, 'T'
union all select 1, 'CCY', 'SET', 'EUR', 'SEL', 100, 'T'
union all select 1, 'CCY', 'SET', 'EUR', 'Closing', 1000, 'B'
union all select 2, 'CCY', 'SET', 'EUR', 'Opening', 2000, 'B'
union all select 2, 'CCY', 'SET', 'EUR', 'SEL', 100, 'T'
union all select 2, 'CCY', 'SET', 'EUR', 'Closing', 2100, 'B'
union all select 3, 'CCY', 'INC', 'EUR', 'Opening', 1000, 'B'
union all select 3, 'CCY', 'INC', 'EUR', 'SEL', 200, 'T'
union all select 3, 'CCY', 'INC', 'EUR', 'BUY', -100, 'T'
union all select 3, 'CCY', 'INC', 'EUR', 'Closing', 1100, 'B'
union all select 4, 'CCY', 'SET', 'GBP', 'Opening', 2000, 'B'
union all select 4, 'CCY', 'SET', 'GBP', 'SEL', 100, 'T'
union all select 4, 'CCY', 'SET', 'GBP', 'Closing', 2100, 'B'
)
select *
from test t
where t.AcctType = 'CCY'
and t.AcctSubType = 'SET'
and t.Sequence = 'B'
and t.Curr in (select w.Curr
from test w
where w.AcctType = 'CCY'
and w.AcctSubType = 'SET'
and w.Sequence = 'B'
group by w.Curr
having COUNT(distinct w.AcctID) > 1)
Теперь это работает для набора данных, хотя что меня беспокоило, будет ли это работать, если бы было более одной валюты с более чем одним счетом операций с капиталом? Работает ли код, который я создал, для того, чего я хочу достичь.
Большое спасибо