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)
现在这适用于数据集,但是如果有多个货币有多个资本账户,那么关注我的是什么呢?我创建的代码是否适用于我想要实现的目标。
非常感谢
答案 0 :(得分:0)
试试这个。
UPD。是的,您的更新代码似乎正常运作,
;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'
) ,
cte_2 AS (
select AcctType, AcctSubType, Curr
from test t
where
t.AcctType = 'CCY'
and t.AcctSubType = 'SET'
GROUP BY AcctType, AcctSubType, Curr
HAVING COUNT(DISTINCT AcctID) > 1
)
SELECT test.*
FROM test
INNER JOIN cte_2
ON test.AcctType = cte_2.AcctType AND test.AcctSubType = cte_2.AcctSubType AND test.Curr = cte_2.Curr
WHERE test.Sequence = 'B'