簡體   English   中英

將多個值匯總到一個表中

[英]Summing multiple values into one table

我在Microsoft Access中有三個表:

  • 表1包含各種公司的名稱以及每個公司的相應唯一ID(以及有關該公司的其他唯一信息);
  • 表2列出了2013年以來各公司的銷售信息;
  • 表3列出了2014年的銷售信息。

    在表2和表3中,單個公司經常被列出多次,分別對應於不同州的銷售額。

在表2和表3中,公司名稱實際上是其對應的ID號,我正在使用查找來顯示名稱。 因此,表1是表2和表3的父級。

我想創建一個查詢,該查詢只列出每家公司一次,以及它們來自表2和3的銷售額之和。當我只嘗試使用Table2或Table3時,這很好用,但是當我將兩者合並時,銷售額會因恆定的標量(例如,一家公司將其銷售額精確地顯示為應有的銷售額的16倍)。 這里發生了什么?

這是SQL在Access中顯示的內容:

SELECT Table2.CompanyName,
       Sum(Table2.TotalRevenue) AS [2013 Revenue],
       Sum(Table3.TotalRevenue) AS [2014 Revenue]
FROM (Table1 INNER JOIN Table2 ON Table1.Company_ID = Table2.CompanyName)
   INNER JOIN Table3 ON Table1.Company_ID = Table3.CompanyName
GROUP BY Table2.CompanyName;

為什么要多次提取這些收入值? 謝謝!

首先,您可以考慮將TABLE2TABLE3合並在一起,只添加一個YEAR字段。 如果您每年繼續增加一張桌子,將來會很混亂。

問題是您正在執行笛卡爾積。

[Every company] x [Sales2013] x [Sales2014]

你需要

[Every company] x [Sales2013] 
UNION
[Every company] x [Sales2014] 

不確定Access中正確的語法是什么,但是您需要在子查詢上計算總計。

而且,如果該公司在該年沒有出售,您需要LEFT JOIN (就像2014年加入公司的公司)和COALESCENULL轉換為0

SELECT Table1.*, 
       COALESCE(T2.Revenue2013, 0)  Revenue2013, 
       COALESCE(T3.Revenue2014, 0)  Revenue2014
FROM Table1
LEFT JOIN ( SELECT CompanyName, SUM(TotalRevenue) as Revenue2013
            FROM Table2
            GROUP BY CompanyName) as T2
       ON  Table1.Company_ID = T2.CompanyName
LEFT JOIN ( SELECT CompanyName, SUM(TotalRevenue) as Revenue2014
            FROM Table3
            GROUP BY CompanyName) as T3
       ON  Table1.Company_ID = T3.CompanyName

您將獲得多個值,因為Table2和Table3不在公司級別。 它們處於銷售級別(我認為)。 因此,每個表都有每個客戶的多個記錄。 company_id上將它們連接將導致Table2中的每個記錄都與Table3中每個company_id每個記錄company_id

如果您想更好地理解這一點,請使用相同的聯接將查詢更改為SELECT * FROM... 您會看到每2013條記錄,都有許多2014年記錄。 這沒有任何意義,因此您的匯總沒有任何意義。

相反,考慮像加入之前對它們求和:

SELECT Table2.CompanyName,
       t2.TotalRevenue AS [2013 Revenue],
       t3.TotalRevenue AS [2014 Revenue]
FROM 
    Table1 
    INNER JOIN (SELECT Company_Id, CompanyName, sum(TotalRevenue) as TotalRevenue FROM Table2 GROUP BY COmpany_ID, CompanyName) as t2 ON Table1.Company_ID = T2.CompanyName)
    INNER JOIN (SELECT Company_Id, CompanyName, sum(TotalRevenue) as TotalRevenue FROM Table3 GROUP BY COmpany_ID, CompanyName) as t3 ON Table1.Company_ID = T3.CompanyName
GROUP BY T2.CompanyName;

發生這種情況是因為您在加入表后正在執行聚合。 舉個例子

Table 1
Company_Id, CompanyName
1           One
2           Two
3           Three

Table 2 (2013)
Company_name, State, Sales
1             CA     50
1             WA     70
2             AK     30

Table 3 (2014)
Company_name, State, Sales
1             CA     60
1             WA     90
2             AK     50

根據您的查詢,首先執行表2的總和,並在內存中獲取

Company_Id, Sales_2013
1           150
2           50

在執行與2014的聯接后,獲取“ 仍在內存中”:

Company_Id, Sales_2013, State_2014, Sales_2014
1           150        CA           50
1           150        WA           90
2           50         AK           30

如您現在所見,您有重復項。 然后,執行第二和,最終獲得

Company_Id, Sales_2013, Sales_2014
1           300         140
2           50          30

為此,您需要執行以下查詢:

SELECT TTable2.CompanyName,
   [2013 Revenue],
   [2014 Revenue]
FROM Table1 INNER JOIN (
    SELECT Table2.CompanyName,
        Sum(Table2.TotalRevenue) AS [2013 Revenue]
    FROM Table2
    GROUP BY Table2.CompanyName
)TTable2
ON Table1.Company_ID = TTable2.CompanyName
INNER JOIN (
    SELECT Table3.CompanyName,
        Sum(Table3.TotalRevenue) AS [2014 Revenue]
    FROM Table3
    GROUP BY Table3.CompanyName
)TTable3
ON Table1.Company_ID = TTable3.CompanyName;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM