【问题标题】:Return all from table but only where distinct field is greater than 1从表中返回所有,但仅在不同字段大于 1 的情况下返回
【发布时间】:2012-03-15 11:50:10
【问题描述】:

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

我是这样开始的,但对如何在大于 1 的货币中包含不同的 AcctID 计数感到困惑:

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

现在这适用于数据集,但我担心的是,如果有不止一种货币和不止一个资本账户,这是否可行?我创建的代码是否适用于我想要实现的目标。

非常感谢

【问题讨论】:

    标签: tsql distinct


    【解决方案1】:

    试试这个。

    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'
    

    【讨论】:

    • 这似乎工作正常,这与我的代码有何不同?考虑到可能有多种货币具有多个资本账户,您认为哪个更好用?
    • 它们非常相似,我在你更新之前写了我的。但我的看起来更灵活,例如,如果您需要不同的帐户 + 客户对,您无法使用 IN 子句解决它。但是如果除了你列出的没有其他条件,你可以使用其中任何一个。
    • 感谢您的帮助,非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多