【问题标题】:My query displays 'n' most recent dates in one column over 'n' rows for each name. I would like 'n' recent dates columns for each name我的查询在每个名称的“n”行上在一列中显示“n”个最近的日期。我想要每个名字的“n”个最近日期列
【发布时间】:2016-08-25 08:20:48
【问题描述】:

对于我的具体情况,n = 4,但可能有一天需要 n=5 或 n=6。

我需要什么的顶级描述:我有一个表单,可以让我在跳转日志中添加姓名和日期。我需要构建一个查询,该查询将显示每个跳线的四个最近的跳跃,每个日期都有一列。

我的表单将数据存储在“JUMP”表中,该表有 3 个字段:JUMPID、NAME、DATE。示例数据如下所示:

JUMPID   NAME   DATE
1        Joe    01-Jul-16
2        Joe    15-Jul-16
3        Adam   15-Jul-16
4        Joe    26-Jul-16
5        Ryan   28-Jul-16
6        Adam   02-Aug-16
7        Joe    10-Aug-16
8        Adam   10-Aug-16
9        Joe    12-Aug-16
10       Mike   19-Aug-16
11       Joe    19-Aug-16
12       Mike   19-Aug-16
13       Dave   19-Aug-16
14       Ryan   23-Aug-16

我现在使用的查询返回每个跳线的最近 4 次跳跃,但将所有日期存储在同一列中。查询是:

Select NAME, [DATE]
From [JUMP]
Where DATE In
   (Select Top 4 [DATE]
    From [JUMP] jum
    Where [JUMP].[NAME] = jum.[NAME]
    Order By jum.[DATE] DESC;)
Order By NAME, [DATE] DESC;

此查询的输出显示如下:

NAME    DATE
Adam    10-Aug-16
Adam    02-Aug-16
Adam    15-Jul-16
Dave    19-Aug-16
Joe     19-Aug-16
Joe     12-Aug-16
Joe     10-Aug-16
Joe     26-Jul-16
Mike    19-Aug-16
Mike    19-Aug-16
Ryan    23-Aug-16
Ryan    28-Jul-16

我想要的是这 4 个最近的跳转,每个跳转都有自己的列,如下所示:

NAME    RECENT1     RECENT2     RECENT3     RECENT4
Adam    10-Aug-16   02-Aug-16   15-Jul-16
Dave    19-Aug-16
Joe     19-Aug-16   12-Aug-16   10-Aug-16   26-Jul-16
Mike    19-Aug-16   19-Aug-16
Ryan    23-Aug-16   28-Jul-16

重复日期是可以的,因为同一跳线可能一天跳不止一次。对于跳跃次数少于 4 次的跳跃者,空字段或 null 字段适用于日期。

通过使用谷歌帮助我构建上面找到的查询,我已经完成了一半。非常感谢任何有助于达到我首选的最终状态的帮助。

【问题讨论】:

  • 我删除了不兼容的数据库标签。请为您真正使用的数据库添加标签。
  • 这是在 MS Access 2007 中使用的,这就是我添加访问标签的原因。我不确定 MySQL 标签。
  • 您需要 sql 进行数据透视。很多例子可以在这里找到或者只是用谷歌搜索。 MS Access 专门有 TRANSFORM
  • 在一般情况下,我对 SQL 和 Access 有点陌生。我一直在学习。我将开始通过 Transform 方法寻找解决方案。感谢您的意见。

标签: sql date ms-access


【解决方案1】:

按照 Serg 的建议,我花了几个小时尝试在 MS Access 中使用 TRANSFORM...PIVOT 方法解决我的问题,但没有成功。我认为这主要是由于缺少一个额外的字段来将每次跳跃分类为最近的 1、2、3、4 或不再跟踪。如果不为每个跳线者每次跳线的记录更新此字段,我想不出一种方法。我可能是错的,我不确定,因为我又不是专家。如果有一种方法可以将值 1、2、3、4 分配给我的原始查询作为计算字段 (?) 返回的每个跳转,我将使用 TRANSFORM 方法。

也就是说,我确实找到了一个最有效的解决方案,但在我看来很笨重。我说主要是因为如果跳线一天跳不止一次,它就会中断。我的部分解决方案包括创建 4 个单独的查询来分别识别第一个、第二个、第三个和第四个最近的跳转,然后将这 4 个查询组合成一个最终查询。

四个查询如下所示:

Select NAME, DATE
From JUMP As jum
Where (
       Select Count(NAME)
       From JUMP
       Where NAME = jum.NAME
       AND DATE > jum.DATE) = 0;   (0 gives me most recent, 1 second most recent, etc.)

此查询的功劳归于 Charles Bretana 在此 stackoverflow 问题上。我真的不明白它是怎么做的,但它可以满足我的需要,除非跳线不止一次。

使用这 4 个查询,然后我构造了另一个查询,它将 4 合并为 1。此查询如下所示:

SELECT Query1.NAME, Query1.DATE, Query2.DATE, Query3.DATE, Query4.DATE
FROM ((Query2 RIGHT JOIN Query1 ON Query2.NAME=Query1.NAME)
       LEFT JOIN Query3 ON Query1.NAME = Query3.NAME)
       LEFT JOIN Query4 ON Query1.NAME = Query4.NAME
ORDER BY query1.NAME;

这为我提供了我需要的格式的数据:具有名称的行和 4 列,每个用于最近的第 1/2/3/4 次跳跃,但当有超过一次跳跃的跳线时会中断一天内。使用上面的原始示例数据,生成的数据表如下所示:

NAME    RECENT1    RECENT2    RECENT3    RECENT4
Adam    10-Aug-16  02-Aug-16  15-Jul-16
Dave    19-Aug-16
Joe     19-Aug-16  12-Aug-16  10-Aug-16  26-Jul-16
Mike    19-Aug-16
Mike    19-Aug-16
Ryan    23-Aug-16  28-Jul-16

如果有更优雅的解决方案,我很乐意看到它们。或者,如果有人知道如何解决我在一天中不止一次跳跃时遇到的问题,我会很乐意提供一些意见。谢谢。

【讨论】:

  • 很确定您的问题出在AND DATE > jum.DATE。更改为 AND DATE >= jum.DATE 应该可以解决您的问题。
  • @Breich 我尝试了您的建议,但没有成功。当我尝试使用AND DATE >= jum.DATE) = 0; 对查询进行编辑时,查询没有返回任何记录,而对于= 1/2/3,它将它们的结果分别转移到= 0/1/2 的未编辑结果中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多