2013-05-29 50 views
0

我有一個名爲tbl_event的主表,它具有多個字段。這些字段包括:id(唯一),protocolID,SubjectID和imgDate1。將多個相關記錄的日期順序排列成一個記錄

現在任何一位患者在此表中可以有多個記錄,但對於允許的記錄數量沒有限制。我想把這些日期按順序編成一個記錄。

例如,如果protocolID:0388813 subjectID:0001在此tabel中有4條記錄,那些記錄的imgDate1是1/1/2011,6/30/1995,3/11/2012,1/1/2000

我想返回,作爲

協議ID:0388813 subjectID:0001 DATE1:1995年6月30日日期2:1/1/2000 DATE3:2011/1/1 Date4:2012年3月11日

有關如何在Access中執行此操作的想法?

+1

您的解決方案存在一個潛在障礙:您說「對每個病人允許多少條記錄」沒有限制,但Access表和查詢限制爲255列,所以如果有[protocolID] + [subjectID]在[tbl_event]中有超過253條記錄,那麼Access將無法產生你想要的輸出。 –

+0

謝謝。那麼沒有理論上的限制,但有一個實際限制30左右。所以這不會是一個問題。 – tferr85

+0

好,很好。還有一點需要澄清:您的樣本數據顯示了按時間順序排列的日期(推測按ID順序列出),期望的結果按時間順序顯示[日期1],[日期2] ...。以[ID]順序生成[Date1],[Date2] ...比按時間順序生成要簡單得多。這是絕對的要求嗎? –

回答

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 

在這種情況下,我們CA ñ修改稍微給我們我們(最終)列名:

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 
+0

太好了,謝謝! – tferr85