我在Microsoft Access中有三个表:
表3包含2014年各自的销售信息。
表2和表2中。 3,单个公司通常不止一次上市,对应不同州的销售情况。
表2和表2中。 3,公司名称实际上是其对应的ID号,我正在使用查找来显示名称。因此,Table1是Table2和Table3的父代。
我想创建一个查询,列出每个公司一次以及表2和表2中的销售总和。 3.当我只尝试使用Table2或Table3时,这种方法很好,但是当我同时使用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;
为什么多次提取这些收入值?谢谢!
答案 0 :(得分:2)
首先,您可以考虑将TABLE2
和TABLE3
合并在一起,只需添加YEAR
字段即可。如果你一年中不断增长一张桌子,将来会很混乱。
[Every company] x [Sales2013] x [Sales2014]
你需要
[Every company] x [Sales2013]
UNION
[Every company] x [Sales2014]
不确定Access中的正确结构是什么,但您需要在子查询上计算总计。
如果公司在那一年没有销售,你需要LEFT JOIN
。 (就像公司加入2014年)和COALESCE
将NULL
转换为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
答案 1 :(得分:1)
您获得了多个值,因为您的Table2和Table3不在公司级别。他们处于销售水平(我假设)。因此每个表都有每个客户的多条记录。在company_id
上加入它们将导致Table2中的每条记录加入表3中每个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;
答案 2 :(得分:0)
这是因为您在加入表后执行聚合。作为一个例子
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;