0

我在 Microsoft Access 中有三个表:

  • 表 1 包括各个公司的名称和对应的唯一 ID(以及有关公司的其他唯一信息);
  • 表 2 包括各公司自 2013 年以来的销售信息;
  • 表 3 包括 2014 年每个产品的销售信息。

    在表 2 和表 3 中,通常不止一次列出一家公司,对应于不同州的销售额。

在表 2 和表 3 中,公司名称实际上是其对应的 ID 号,我使用查找来显示名称。因此,Table1 是 Table2 和 Table3 的父级。

我想创建一个查询,将每家公司以及表 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;

为什么它会多次拉动这些收入值?谢谢!

4

3 回答 3

2

首先,您可以考虑合并TABLE2TABLE3一起添加一个YEAR字段。如果您继续增加一张桌子,那么将来会很混乱。

问题是您正在执行笛卡尔积。

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

你需要

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

不确定 Access 中的正确语法是什么,但您需要计算子查询的总计。

而且你需要LEFT JOIN以防公司在那一年没有出售。(就像 2014 年加入的公司)并COALESCE转换NULL0.

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
于 2016-03-02T14:58:55.740 回答
1

您获得了多个值,因为您的 Table2 和 Table3 不在公司级别。他们处于销售水平(我假设)。因此,每个表都有每个客户的多条记录。加入它们company_id将导致 Table2 中的每条记录加入到 Table3 中的每条记录中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;
于 2016-03-02T15:06:50.113 回答
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进行join后,得到Still on memory:

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;
于 2016-03-02T15:13:25.977 回答