2014-01-15 42 views
0

我有四個以父子關係構造的表。一個表具有一個主鍵,另外三個表(否則彼此不相關)將該主鍵作爲外鍵。也就是說,表A有一個稱爲客戶ID的主鍵。表B,C和D也有客戶ID和一些其他信息。總結多表親子關係的公共列

我想達到什麼是總結表列2 B,C和D.我曾嘗試:

SELECT dbo.a.primary_key, 
     SUM(dbo.b.column2) AS Expr1, 
     SUM(dbo.c.column2) AS Expr2, 
     SUM(dbo.d.column2) AS Expr3 
FROM dbo.a 
INNER JOIN dbo.b ON dbo.a.primary_key = dbo.b.column1 
INNER JOIN dbo.c ON dbo.a.primary_key = dbo.c.column1 
INNER JOIN dbo.d ON dbo.a.primary_key = dbo.d.column1 
GROUP BY dbo.a.primary_key 

這將返回什麼。我也嘗試了一個返回空值的左外連接。我還與以下線,這是我真正想實現試了一下:

SUM(dbo.b.column2) + SUM(dbo.c.column2) + SUM(dbo.d.column2) AS Expr1 

這可能會下降到設計很糟糕,我可以有效地連接這三個表到一個表,但相信這是這樣整潔。

一旦我解決了這個問題,我想將它擴展爲表B,C和D的第3列,以便它們有一個日期字段,它是一個int並鏈接回日期表(E)。我想同時將表A,B,C和D連接到新創建的E,並按日期和a.primary_key分組。這是可能的,還是我需要重新考慮設計?

+0

如何加入列'JOIN dbo.b.column2'到一個表,不應該是表嗎? – user2989408

+0

一旦你讓這個人安頓下來,請舉一個很好的例子 - 就像你在這裏做的那樣 - 爲第二部分......也許在一個新的問題! –

+0

對於錯字感到抱歉。我忙於剝奪桌子和桌子的名字,並無意中改變了那個名字。這仍然不會返回結果 – TXL

回答

1

如果您只需要選擇一個單獨的列,則可以使用APPLY而不是JOIN。
編輯:如果有任何NULL值此查詢應該給你一個SUM ...
EDIT2:改變了CROSS APPLYOUTER APPLY,因爲在案件的款項之一是不存在的,整個行將被從結果中下降。

SELECT a.primary_key, 
    b.Sum AS Expr1, 
    c.Sum AS Expr2, 
    d.Sum AS Expr3, 
    ISNULL(b.Sum, 0) + ISNULL(c.Sum, 0) + ISNULL(d.Sum, 0) as [GrandTotal] 
FROM dbo.Agency_Table a 
    OUTER APPLY (SELECT SUM(ISNULL(b.column2, 0)) [Sum] FROM dbo.b WHERE a.primary_key = b.column1) as b 
    OUTER APPLY (SELECT SUM(ISNULL(c.column2, 0)) [Sum] FROM dbo.c WHERE a.primary_key = c.column1) as c 
    OUTER APPLY (SELECT SUM(ISNULL(d.column2, 0)) [Sum] FROM dbo.d WHERE a.primary_key = d.column1) as d 
+0

這工作。正如我上面發佈的,我認爲問題的關鍵是如何處理這個問題「好吧,我想我已經發現問題與你們的幫助有什麼關係。a.primary_key可能不包含b.column1中的一個或多個值,c.column1和d.column1「 – TXL

+0

這應該可能是一個新問題,但如果我想將頂部位更改爲b.sum + c.sum + d.sum,則返回空值。即時猜測我需要趕上空值的某種方式 – TXL

+0

@TSScoder我已經發布了一個修改後的查詢,也將選擇三個SUM的總和..火上燒 – user2989408

0

從你的例子中清楚的一點是,你不小心將列名放入JOIN表名中。

變化

INNER JOIN 
dbo.b.column2 

INNER JOIN 
dbo.b 

,並同其他兩個。

+0

抱歉,刪除列名稱時出錯。這仍然沒有結果。 – TXL

+0

嗯。關於您的查詢,除此之外沒有任何顯着的結果你能抽出一些樣本數據並在這裏發佈嗎?理想情況下,將其編寫爲CREATE和INSERT語句,以便我們可以重新創建場景。 –