2012-02-12 145 views
2

,我有以下数据集:TSQL查询联接

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 

有什么建议吗?

回答

3

也许不是最有效的方式,但是这应该让你,你找什么:

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) 
) 
+0

感谢这很接近做我所需要的。我不得不合作的数据与我预期的有点不同。数据还包括每个periodID的多个日期,每个日期只有一个accountID。 – Duane 2012-02-15 14:48:48

1

的另一种方式做到这一点,假设帐户是在一个周期内的独特:

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 
+0

这不会产生正确的结果。例如,应该只有一个记录'M0001',另一个记录'Y0001',这个查询产生两个记录'M0001',而没有'Y0001' – 2012-02-13 00:51:19

+0

将这个'COALESCE(m1.Account,m2.account) '这个'STUFF(m1.Account,1,1,at.AccountType)作为账户' – 2012-02-13 00:51:33

+0

对不起,你是正确的。实际上,我在第一次编辑时确实提供了你建议的那一行,但是当我意识到这个问题要求重复Y记录时就改变了它。没有测试它,但它错了。现在我又改了它,并且还添加了一个ORDER BY子句。 – 2012-02-13 08:44:28