Возврат всего из таблицы, но только в том случае, если отдельное поле больше 1 - PullRequest
1 голос
/ 15 марта 2012

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 голосов
/ 15 марта 2012

попробуйте это.

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'
...