2014-11-05 156 views
1

我遇到了一個連接,我嘗試連接兩次相同的表。加入同一張表兩次

CREATE TABLE [dbo].[Accounts]( 
    [Account] [nvarchar](10) NULL, 
    [Value] [real] NULL, 
    [Period] [nvarchar](8) NULL) 

    INSERT INTO [dbo].[Accounts] VALUES ('AC1', 100, '201407') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC2', -100, '201407') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC3', 200, '201407') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC4', -200, '201407') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC1', 100, '201408') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC1', -100, '201408') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC2', 200, '201408') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC2', -200, '201408') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC5', 100, '201407') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC5', -100, '201407') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC6', 200, '201408') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC6', -200, '201408') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC3', 200, '201408') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC3', -200, '201408') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC7', 300, '201408') 
    INSERT INTO [dbo].[Accounts] VALUES ('AC8', -300, '201408') 

第一個結果,我嘗試存檔是在第一列中的所有帳戶和在單獨的列中各時期的值。我嘗試了許多不同的連接,沒有任何工作。最後我有下面的內容,但它複製了第一期的一些記錄,並沒有顯示一些帳戶。

SELECT A1.account, A1.value, A2.value FROM Accounts A1 
    FULL OUTER JOIN accounts A2 on A1.account = A2.account 
    WHERE A1.Period = '201407' and A2.period = '201408' 

我嘗試歸檔應該提供這樣的結果最終查詢:

ACCOUNT P1 P2 
AC1  100 0 
AC2  -100 0 
AC3  200 0 
AC4  -200 NULL 
AC5  0 NULL 
AC6  0 0 
AC7  NULL 300 
AC8  NULL -300 

我做錯了嗎?我試過所有可能的連接類型和neasted選擇:(

感謝這麼多的任何援助

回答

2

湯姆,一個連接來實現你正在尋找的結果是不需要嘗試下面的代碼:。

select account 
    ,P1=sum(case when period = '201407' then value else null end) 
    ,P2=sum(case when period = '201408' then value else null end) 
from Accounts 
where period in ('201407', '201408') 
group by account 
0

感謝您的快速答覆。 它工作:)

在同時,我也發現了另一個解決方案,它也在努力。 分析你的我認爲這是更有效率,然後我的。

謝謝!

select distinct(x.account) konto, a.v1, b.v2 from accounts X 
left join(select account a1, sum(value) v1 from accounts where Period = '201407' group by account) a on a.a1 = x.account 
left join(select account a2, sum(value) v2 from accounts where Period = '201408' group by account) b on b.a2 = x.account