将多个相关记录日期排序为一个记录顺序

时间:2013-05-29 12:43:07

标签: ms-access

我有一个名为tbl_event的主表,它有多个字段。这些字段包括:id(唯一),protocolID,SubjectID和imgDate1。

现在,任何一名患者都可以在此表中拥有多条记录,并且对于允许的记录数量没有限制。我想把这些日期按顺序分成一个记录。

例如,如果protocolID:0388813 subjectID:0001在此表格中有4条记录,那些记录的imgDate1是1/1/2011,6 / 30/1995,3/11 / 2012,1 / 1/2000

我想将其作为

返回

协议ID:0388813 subjectID:0001 DATE1:6/30/1995 Date2:1/1/2000 Date3:1/1/2011 Date4:03/11/2012

关于如何在Access中执行此操作的想法?

1 个答案:

答案 0 :(得分:0)

在名为[tbl_event]

的表中考虑以下示例数据
ID  protocolID  SubjectID  imgDate1  
--  ----------  ---------  ----------
 1  0388813     0001       2011-01-01
 2  0388813     0001       1995-06-30
 3  0388813     0001       2012-03-11
 4  0388813     0001       2000-01-01
 5  0388813     0002       2013-05-06
 6  0388814     0001       2013-04-14

由于我们很幸运拥有[ID]字段,我们可以使用“自联接”技巧通过[protocolID] + [SubjectID]生成排名列表:

SELECT ID, protocolID, SubjectID, imgDate1, COUNT(*) AS Rank
FROM
    (
        SELECT t1.* 
        FROM 
            tbl_event t1 
            INNER JOIN 
            tbl_event t2 
                ON t2.protocolID=t1.protocolID 
                    AND t2.SubjectID=t1.SubjectID 
                    AND t2.ID<=t1.ID
    )
GROUP BY ID, protocolID, SubjectID, imgDate1

... ...生产

ID  protocolID  SubjectID  imgDate1    Rank
--  ----------  ---------  ----------  ----
 1  0388813     0001       2011-01-01     1
 2  0388813     0001       1995-06-30     2
 3  0388813     0001       2012-03-11     3
 4  0388813     0001       2000-01-01     4
 5  0388813     0002       2013-05-06     1
 6  0388814     0001       2013-04-14     1

在这种情况下,我们可以略微修改它以给我们(最终)列名称:

SELECT ID, protocolID, SubjectID, imgDate1, "Date" & Format(COUNT(*), "00") AS ColName
FROM
    (
        SELECT t1.* 
        FROM 
            tbl_event t1 
            INNER JOIN 
            tbl_event t2 
                ON t2.protocolID=t1.protocolID 
                    AND t2.SubjectID=t1.SubjectID 
                    AND t2.ID<=t1.ID
    )
GROUP BY ID, protocolID, SubjectID, imgDate1

... ...生产

ID  protocolID  SubjectID  imgDate1    ColName
--  ----------  ---------  ----------  -------
 1  0388813     0001       2011-01-01  Date01 
 2  0388813     0001       1995-06-30  Date02 
 3  0388813     0001       2012-03-11  Date03 
 4  0388813     0001       2000-01-01  Date04 
 5  0388813     0002       2013-05-06  Date01 
 6  0388814     0001       2013-04-14  Date01 

如果我们将该查询保存为[tbl_event_xtab_base],那么我们可以在交叉表查询中使用它:

TRANSFORM Max(tbl_event_xtab_base.[imgDate1]) AS MaxOfimgDate1
SELECT tbl_event_xtab_base.[protocolID], tbl_event_xtab_base.[SubjectID]
FROM tbl_event_xtab_base
GROUP BY tbl_event_xtab_base.[protocolID], tbl_event_xtab_base.[SubjectID]
PIVOT tbl_event_xtab_base.[ColName];

... ...生产

protocolID  SubjectID  Date01      Date02      Date03      Date04    
----------  ---------  ----------  ----------  ----------  ----------
0388813     0001       2011-01-01  1995-06-30  2012-03-11  2000-01-01
0388813     0002       2013-05-06                                    
0388814     0001       2013-04-14