【问题标题】:MS Access 2010: Extract unique valuesMS Access 2010:提取唯一值
【发布时间】:2014-11-20 00:33:21
【问题描述】:

首先:我对 MS Access 几乎一无所知,但现在我不得不使用它(数据集对于 Excel 来说太大了)。数据具有列名称,例如 Customer_Name、Product Name、Amount、Date

日期是指一个月的最后一天,例如二月是 2013 年 2 月 28 日。现在我想将客户在 2 月份购买的金额与他/她在 1 月份购买的金额进行比较并计算差额。到目前为止,我已经能够通过提示用户输入日期来做到这一点。

SELECT Data.Customer_Name,   
Sum(IIf(Format(Date,"yymm")=[Startdate (yymm)?],Amount,0)) AS Amount_Startdate, 
Sum(IIf(Format(Date,"yymm")=[Enddate (yymm)?],Amount,0)) AS Amount_Enddate, 
Amount_Enddate-Amount_Startdate AS Difference
FROM Data
GROUP BY Data.Customer_Name;

这可行,但 Access 是否可以识别“日期”列中的哪些日期(只有两个不同的日期),因此用户不必输入任何内容?此外,我尝试将“Amount_Startdate”替换为名称中包含相应日期的字段(例如“Amount_Feb2013”​​),并使用 & 号进行操作,但它没有用。

【问题讨论】:

标签: ms-access ms-access-2010


【解决方案1】:

如果您创建一个名为 tblValues 的新表,其中只有 2 个字段; ID 和 TDate(始终尽量避免使用“日期”、“系统”等保留字或 Access 已为其分配函数的其他字),您可以这样填写:

ID        TDate 
--        ---------
ST        1/31/2014 
EN        2/28/2014

然后你可以使用 DLookup 函数来使这段代码通用:

SELECT Data.Customer_Name,   
Sum(IIf(Format(Date,"yymm")=DLookup(Format(TDate, "yymm"), tblValues, "ID = 'ST'"),Amount,0)) AS Amount_Startdate, 
Sum(IIf(Format(Date,"yymm")=DLookup(Format(TDate, "yymm"), tblValues, "ID = 'EN'"),Amount,0)) AS Amount_Enddate, 
Amount_Enddate-Amount_Startdate AS Difference
FROM Data
GROUP BY Data.Customer_Name;

然后,您可以随时使用要用作开始和结束日期的值来更新表格。

【讨论】:

  • 感谢您的帮助,但这并不是我想要的。查询的列应如下所示: Customer_Name, Amount_Feb2014, Amount_Mar2014, Difference 日期可能会有所不同,因此对于一项任务,我可能使用 2014 年 3 月和 2014 年 4 月的数据,对于另一项任务,可能是 2012 年 5 月和 2014 年 6 月(但在任何时候,表中只有两个不同的日期)。因此,我希望 Access 识别日期,使用它们相应地命名查询列 (Amount_Feb2014) 并对每个月的金额求和。这可能吗?
  • 好的,我更改了答案以考虑到您所说的内容。很确定“DLookup()”是你想要的方式。纯自动化的问题在于确定哪个是开始,哪个是结束,除非您在它之前运行排序查询并且只是按升序获取唯一日期。如果您在 VBA 中执行此操作而不是在查询中执行此操作,这可能会更容易,因为它会给您更多的灵活性。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2013-03-15
  • 2019-01-01
相关资源
最近更新 更多