TSQL Query Join - PullRequest
       7

TSQL Query Join

2 голосов
/ 13 февраля 2012

У меня есть следующий набор данных:

ID   PeriodID    Account     Amount  
1    1000        Y0001       100.00  
2    1000        M0001       20.00  
3    1000        Y0002       75.00  
4    1000        M0002       15.00  
5    1000        Y0003       100.00  
6    1000        Y0004       200.00  

Мне нужно написать запрос, который возвращает ноль за все время, когда есть учетная запись «Y» и нет учетной записи «M», например:

PeriodID    Account     Amount  
1000        Y0001       100.00  
1000        M0001       20.00  
1000        Y0002       75.00  
1000        M0002       15.00  
1000        Y0003       100.00  
1000        Y0003       0.00  
1000        Y0004       200.00 
1000        Y0004       0.00 

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Возможно, не самый эффективный способ, но он должен дать вам то, что вы ищете:

SELECT PeriodID, Account, Amount
FROM myTable

UNION ALL

SELECT PeriodID, Account, 0.00 AS Amount
FROM myTable A
WHERE NOT EXISTS (
    SELECT * FROM myTable B 
    WHERE B.Account = 'M' + SUBSTRING(A.Account, 2, LEN(A.Account) - 1)
)
1 голос
/ 13 февраля 2012

Альтернативный способ сделать это, предполагая, что учетная запись уникальна за один период:

SELECT m1.PeriodID
    , COALESCE(CASE WHEN at.AccountType = 'Y' then m1.Account end, m2.Account, m1.Account) as Account
    , COALESCE(CASE WHEN at.AccountType = 'Y' then m1.Amount end, m2.Amount, 0.00) as Amount
FROM myTable m1
    LEFT OUTER JOIN myTable m2
        ON m2.PeriodID = m1.PeriodID
        AND m2.ACCOUNT = STUFF(m1.Account, 1, 1, 'M')
    CROSS JOIN (SELECT 'Y' as AccountType UNION ALL SELECT 'M') at
WHERE m1.Account LIKE 'Y%'
ORDER BY m1.PeriodID, m1.Account, at.AccountType DESC
...