【问题标题】:Merging of multiple tables with Microsoft Access使用 Microsoft Access 合并多个表
【发布时间】:2019-12-24 19:31:04
【问题描述】:

在工作中,我在使用 Microsoft Access 将多个表合并为一个表时遇到问题。所以我拥有的是一个包含多个表的 Microsoft Access DB 文件。

我们可以假设每个表只包含两列。 CustomerID 和 numb_of_purchases。我每个月都有一张表,并且想将所有这些表合并到一张大表中,例如两个月:

TableJan
    Customer_ID  numb_of_purchases_Jan
    1                     10
    2                     53
    3                     98
    4                     101

TableFeb
    Customer_ID  numb_of_purchases_Feb
    3                     86
    5                     5

应该合并到一个更大的表中,如下所示:

  Customer_ID  numb_of_purchases_Jan  numb_of_Purchases_Feb
    1                     10                   0
    2                     53                   0
    3                     98                   86
    4                     101                  0
    5                     0                    5

你会如何解决这样的问题?起初我认为使用 UNION 函数会很容易,因此我尝试编写以下查询:

SELECT TableJan.Customer_ID, numb_of_purchases_Jan
FROM Table_Jan

UNION

SELECT TableFeb.Customer_ID, numb_of_purchases_Feb
FROM Table_Feb;

执行此查询大致如下:

Customer_ID  numb_of_purchases_Jan
1                     10
1                     0
2                     53
2                     0
3                     98
3                     86
4                     101
4                     0
5                     5

所以本质上,与所需输出相比,我缺少一整列,而是将 numb_of_purchases_Feb 的值存储在 numb_of_purchases_Jan-column 中。

如果有人能指出我的 UNION 命令中的任何错误或对给定问题有其他可能更简单的解决方案,我将不胜感激。

【问题讨论】:

  • 您的问题完美地说明了数据库未标准化所带来的问题。 support.microsoft.com/en-gb/help/283878/…
  • 哦...我看到您从未将以前的问题标记为已回答。请解决这个问题,以表达对那些试图帮助你的人的尊重。

标签: sql merge union


【解决方案1】:

@Himanshu 为回答您的问题提供了一个良好的开端。但是我认为您要求的设计效率低下。我宁愿使用类似的东西:

SELECT TableJan.Customer_ID, numb_of_purchases_Jan as numb_of_purchases, #1/1/2019# as Period 
FROM Table_Jan 
UNION ALL 
SELECT TableFeb.Customer_ID, numb_of_purchases_Feb as numb_of_purchases, #2/1/2019# as Period 
FROM Table_Feb; 

然后你会得到一个 3 字段数据集:

  • 客户 ID
  • numb_of_purchases
  • 期间

您可以从中轻松计算每月、每季度、每年的销售额......

你有什么好的理由去规范化吗?数百万行?

【讨论】:

  • 谢谢。明天我会尝试你的建议,并让你知道结果。关于没有标准化表:没有任何原因,我只是手头有数据集并且必须使用它们。我无权访问核心数据库。
【解决方案2】:

UNION 是将行组合在相同的列和类型上。

由于您的 o/p 不包含与您的输入不同的列,因此您需要使用 Join

   SELECT a.Customer_ID, 
      a.numb_of_purchases_Jan,
      b.numb_of_purchases_FEB
     FROM TABLE_JAN a LEFT 
    JOIN TABLE_FEB b on 
     a.Customer_ID=b.Customer_ID

【讨论】:

  • JOIN 确实是这里的路,但由于 MS Access 不支持full outer join,你需要UNION 一个RIGHT JOIN 到你的LEFT JOIN,以防我们有2 月的新客户。
  • 编辑:啊,帕特里克更快。你们有没有使用联合来结合右连接和左连接的示例代码?啊,没错。 UNION 不起作用是有道理的。但是如果使用 Left Join,我会丢失仅在 2 月份购买而在 1 月份未购买的人的 Customer_ID,对吗?因为那是我想看到的。我想为此使用完全联接,因为这会给我完整的 Customer_ID 列表,但 Access 似乎不支持完全联接。
【解决方案3】:

MS Access 不支持完全外连接。但你也许可以使用union allgroup by

SELECT Customer_ID,
      SUM(numb_of_purchases_Jan) as numb_of_purchases_Jan,
      SUM(numb_of_purchases_Feb) as numb_of_purchases_Feb
FROM (SELECT TableJan.Customer_ID, numb_of_purchases_Jan, 0 as numb_of_purchases_Feb
      FROM Table_Jan 
      UNION ALL 
      SELECT TableFeb.Customer_ID, 0, numb_of_purchases_Feb 
      FROM Table_Feb 
     ) c
GROUP BY Customer_ID
ORDER BY Customer_ID;

然后,您应该修复数据处理。没有理由将相同的信息存储在具有相同结构的表中。所有这些数据都应该在一个表中,并带有一个指定时间段的附加列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多