2017-07-19 56 views
0

Folks。我似乎無法找到這個問題的答案。我可以在SQL Server中執行此操作,但我現在正在使用Access 2013,而我通常的SQL技巧似乎無法正常工作。從MS Access中的多個表中總計總計

我需要創建班級成本與收入總結報告。

我有三個表:班級列表,成本列表,註冊列表。成本和註冊(成本&收入)都通過在所有表中標識該類的關鍵字段與班級列表相關聯。

我能夠運行成本報告或收入報告,並且每個班級的總計都很好,但是當我組合它們以獲取每個班級的淨額時,成本會乘以註冊中的行數報告,反之亦然。

我試過使用外部連接,但訪問不喜歡它,即使在正確的地方[]。將excel留在訪問中會更好,因爲離開excel是整個重點。

tables and expected results

incorrect results

這裏的壞結果背後的SQL。我知道這些連接是錯誤的,但我無法訪問接受任何其他類型的連接。

SELECT DISTINCTROW Classes.ID, 
     Classes.Title, 
     Classes.Instructor, 
     Classes.Date, 
     Sum(Costs.Amount) AS [Sum Of Amount], 
     Sum(Registrations.Tuition) AS [Sum Of Tuition], 
     Count(*) AS [Count Of Classes] 
FROM (Classes 
     LEFT JOIN Registrations ON Classes.[ID] = Registrations.[Class ID]) 
LEFT JOIN Costs ON Classes.[ID] = Costs.[Class ID] 
GROUP BY Classes.ID, 
     Classes.Title, 
     Classes.Instructor, 
     Classes.Date; 

有什麼建議嗎?提前致謝。

+0

爲成本和收入彙總查詢構建一個彙總查詢,然後將2個彙總查詢加入到班表列表中。 – June7

+0

歡迎來到SO。首先,請參閱[左和右連接操作](https://support.office.com/zh-cn/article/LEFT-JOIN-RIGHT-JOIN-Operations-ebb18b36-7976-4c6e-9ea1-c701e9f7f5fb)。 SQL語法(包括JOIN關鍵字)與SQL Server不同。 –

+0

您提到了「SQL技巧」,「任何其他類型的連接」以及「在SQL Server中執行此操作」的功能。如果你已經嘗試過這樣的事情,或者如果你認爲其他語法在其他地方有效,那麼可以將這樣的例子包括在內,而不是僅僅提及它們。這不僅可以提供可操作的東西,還可以揭示可能不會用文字表達的細節。我沒有看到任何聯接或語法如何讓您執行單個查詢來獲取不同表上的聚合。即使它們是子查詢,也需要分別總結成本和學費。 –

回答

0

即使將它們連接到相同的主表,您也需要兩個單獨的查詢來彙總不同表的值。否則,SQL的select部分將在另外兩個表上執行交叉連接,從而有效地爲每個註冊重新選擇每個成本值。這個選擇過程發生在分組和聚合之前(即總和,計數)。這就是爲什麼你得到乘法和。

由於查詢是基於中的每個表中的字段選擇值,因此DISTINCTROW無效,因此它必須有效地保留原始集合中的每一行。 DISTINCTROW確實不是首先從一個表中選擇行,然後從另一個表中獨立地選擇行(也不會將它們分開總結)。而是應用完整選擇和交叉連接,然後通過詢問「該行只包含來自已選源表格行的數據?」來過濾掉行。如果答案是肯定的,那麼它將從最終選擇中排除。但是,如果所選數據包含連接中每個表的值,則每行都是唯一的,因此不會排除任何內容。

定義一個總和:

SELECT Classes.ID As ID, 
     Sum(Costs.Amount) AS [Sum Of Amount] 
FROM Classes 
    LEFT JOIN Costs 
    ON Classes.[ID] = Costs.[Class ID] 
GROUP BY Classes.ID 

那麼其他:

SELECT Classes.ID As ID, 
     Sum(Registrations.Tuition) AS [Sum Of Tuition] 
FROM Classes 
    LEFT JOIN Registrations ON Classes.[ID] = Registrations.[Class ID] 
GROUP BY Classes.ID 

你可以保存在訪問這些查詢,然後按名稱引用它們在其他疑問,或者您可以包含嵌入式SQL 。在這種情況下,它只是個人偏好,但嵌入式查詢不能使用可視化設計視圖進行檢查或編輯,而必須使用Access中的SQL視圖進行編輯。

SELECT DISTINCTROW Classes.ID, Classes.Title, 
     Classes.Instructor, Classes.Date, 
     CostsAgg.[Sum Of Amount], 
     RegAggs.[Sum Of Tuition] 
FROM (Classes LEFT JOIN 
     (SELECT Classes.ID As ID, Sum(Costs.Amount) AS [Sum Of Amount] 
     FROM Classes LEFT JOIN Costs ON Classes.[ID] = Costs.[Class ID] 
     GROUP BY Classes.ID) AS CostsAgg ON Classes.ID = CostsAgg.ID) 
     LEFT JOIN 
     (SELECT Classes.ID As ID, Sum(Registrations.Tuition) AS [Sum Of Tuition] 
     FROM Classes LEFT JOIN Registrations ON Classes.[ID] = Registrations.[Class ID] 
     GROUP BY Classes.ID) AS RegAggs 
     ON Classes.ID = RegAggs.ID 
GROUP BY Classes.ID, 
     Classes.Title, 
     Classes.Instructor, 
     Classes.Date; 

我沒有包含Count列,因爲從示例中不清楚你真的想要計算什麼。當然,您可以在任何子/查詢中分別包含一個計數字段,也可以在其中包含所有這些字段以獲取不同的值。

+0

C珀金斯,這工作。坦率地說,這些聚合查詢正處於我的查詢技能的邊緣。我能夠將代碼轉換爲我的數據庫的細節,並運行一個報告來準確比較兩個總計。我會密切研究一段時間。謝謝。 –