【问题标题】:MS ACCESS Cross table DATAMS ACCESS 交叉表数据
【发布时间】:2015-01-17 05:10:55
【问题描述】:

我有两张表,一张包含员工详细信息,如下所示

Employee ID | Employee Name | Start Date | Termination Date |

2234        |  John Smith  | 2014-01-03  |                  |   

3333        | Jane Doe     | 2014-04-22  |  2014-10-31      |

1234        | Bobby Wilson | 2013-12-10  |                  |

我的第二张表有按月计算的销售额

看起来是这样

Employee ID | 2013-12 |   2014-01   | 2014-02  | 2014-03  |  2014-04 | etc | etc 

2234        |         |   199.99    |  130.00  |  300.00  |  230.99  | etc | etc

3333        |         |             |          |          |  204.02  | etc | etc

1234        |  455.99 |   332.32    |  334.00  |  553.00  |  334.99  | etc | etc

所以我需要做一个新的查询,帮助我显示员工的趋势,了解他们第一个月的员工销售数量、第二个月的销售额、第三个月的销售额等。员工开始了。超过 12 个月或更长时间

所以新表如下所示

Employee    |  Month 1  |  Month 2  |  Month 3  | Month 4  | etc |  etc |  

2234        |   199.99  |  130.00   |  300.00   |  230.99  | etc |  etc |

3333        |  240.02  |  (month 2) |  (month 3)| (month 4)| etc |  etc |       

1234        |  455.99  |  332.32    |   334.00  |  553.00  | etc |  etc |  

所以我知道我们可以通过员工 ID 加入这两个表 我知道我们可以根据员工的开始日期确定他们的第一个月 但是如何用 SQL 写出这个查询呢?

【问题讨论】:

  • 这就是糟糕的表格设计给您带来麻烦的地方。从理论上讲,我可以看到在 VBA 中的哪个位置可以去掉开始日期的日期,然后使用年月作为指针,但我认为你不能直接用 SQL 做到这一点。由于每个人的年月不同,因此无法将一张表连接到另一张表并以您想要的方式显示数据。
  • 这个问题和它有什么不同吗:stackoverflow.com/questions/27951872/…?
  • 好吧,您可以在 SQL 中使用 FORMAT 去除一天,我们将其去除为月份,这并不困难。但是弄清楚如何检查每个员工的第一个月与他们的开始日期是什么
  • @MaciejLos 这实际上是我昨天问的第一个问题的第二部分
  • 有没有办法检查第一个月的销售情况?即使我们将其剥离为 yyyy/mm ?

标签: sql ms-access


【解决方案1】:

正如我在对该问题的评论中提到的,您需要将第二个表格的设计更改如下(伪代码):

CREATE TABLE Sales(
    SaleId Autonumber PK
    [Employee ID] FK (reference to Employees table)
    SalesDate DateTime
    Sales Decimal/Double
);

那么您就可以通过这种方式保存数据:

SaleID  EmpId   SalesDate   Sales
1       2234    2014-01-01  199,99
2       1234    2013-12-01  455.99
3       1234    2014-01-01  332.32
4       2234    2014-02-01  130
5       1234    2014-02-01  334
6       2234    2014-03-01  300
7       1234    2014-03-01  553
8       2234    2014-04-01  230.99
9       3333    2014-04-01  204.02
10      1234    2014-04-01  334.99

最后,您的数据透视表可能如下所示:

TRANSFORM Sum(S.Sales) AS SumOfSales
SELECT E.[Employee Id], E.[Employee Name]
FROM Employees AS E INNER JOIN SalesByMY AS S
     ON E.[Employee Id] = S.[Employee Id]
GROUP BY E.[Employee Id], E.[Employee Name]
PIVOT 'Month-' & DateDiff('m',[E].[StartDate],[S].[SalesDate])+1;

结果:

EmpId   EmpName        Month-1  Month-2 Month-3 Month-4 Month-5
1234    Bobby Wilson   455.99   332.32  334     553     334.99
2234    John Smith     199.99   130     300     230.99  
3333    Jane Doe       204.02

【讨论】:

  • 您需要找出它发生的原因。正如您在我的示例中看到的那样,我在真实数据上测试了这个解决方案。
  • 没关系,这对我的应用程序非常有效,是我的数据搞砸了(即有人更改了员工的开始日期,但他们在开始日期之前仍有销售)
  • 在上面的注释中,是否可以忽略任何在开始日期之前的销售数字?
  • 添加 where 语句:WHERE E.StartDate >= S.SalesDate
  • E.StartDate
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2015-12-28
  • 1970-01-01
相关资源
最近更新 更多