从表中返回all,但仅在distinct字段大于1的位置返回

时间:2012-03-15 11:50:11

标签: tsql distinct

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)

现在这适用于数据集,但是如果有多个货币有多个资本账户,那么关注我的是什么呢?我创建的代码是否适用于我想要实现的目标。

非常感谢

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'