TSQL 查询连接

问题描述 投票:0回答:3

我有以下数据集:

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 

有什么建议吗?

sql sql-server tsql sql-server-2000
3个回答
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)
)

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
投票

使用案例:

架构:

CREATE TABLE Table1
("ID" int, "PeriodID" int, "Account" varchar(5), "Amount" int);

INSERT INTO Table1
("ID", "PeriodID", "Account", "Amount")
VALUES
(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);

查询:

SELECT "PeriodID", "Account",
CASE WHEN Substring("Account",0,2) = 'M'THEN "Amount" ELSE 0.0 END As value
FROM Table1
© www.soinside.com 2019 - 2024. All rights reserved.