2016-08-25 50 views
2

对于我的具体情况,n = 4,但可能有一天需要n = 5或n = 6。我的查询在每个名称的'n'行上的一列中显示'n'最近的日期。我想为每个名称的'n'近期日期列

我需要的顶级描述:我有一个表格,它允许我将名称和日期添加到跳转日志中。我需要构建一个查询,为每个跳线显示四个最近的跳转,并为每个日期显示一列。 JUMPID,名称,日期:

我的形式,其中有3个字段中的“跳转”表存储的数据。样本数据是这样的:

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次的跳线,空或空字段适用于日期。

我已经通过使用谷歌中间得到了一半,这帮助我建立了上面的查询。任何帮助达到我的首选最终状态将非常感激。

+1

我删除了不兼容的数据库标签。请为您真正使用的数据库添加标签。 –

+0

这是在MS Access 2007中使用的,这就是我添加访问标签的原因。我不确定MySQL标签。 – nytewulf97

+2

您需要sql用于数据透视。很多例子可以在这里找到,或者只是搜索一下。 MS Access专门有TRANSFORM – Serg

回答

1

我花了几个小时试图解决我的问题,使用MS Access中的TRANSFORM ... PIVOT方法,Serg建议没有成功。我认为这主要是因为缺乏一个额外的领域,将每次跳跃分类为最近的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在这个计算器的问题。我真的不明白它是如何做到的,但它适用于我需要的东西,除非跳投跳投不止一次。

使用这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列,其中每一次为第一/第二/第三/第四次最近的跳跃,但在有一天跳超过一次的跳投时会中断。使用上面的原始样本数据,得到的数据表看起来是这样的:

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 

如果有更优雅的解决方案在那里,我很乐意看到他们。或者,如果有人知道如何解决我在一天中跳过一次以上的问题,我会喜欢一些输入。谢谢。

+0

很确定你的问题在'AND DATE> jum.DATE'。更改为'AND DATE> = jum.DATE'应该可以解决您的问题。 –

+0

@Breich我尝试了你的建议,但没有奏效。当我在'AND DATE> = jum.DATE)= 0;'的查询上尝试编辑时,查询没有返回记录,对于'= 1/2/3',它将结果转换为未编辑的结果'= 0/1/2'。 – nytewulf97