2013-05-29 4 views
0

У меня есть таблица с названием tbl_event с несколькими полями. По этим полям: id (уникальный), protocolID, SubjectID и imgDate1.Закажите несколько связанных записей в одной записи последовательно

Теперь любой пациент может иметь несколько записей в этой таблице без каких-либо ограничений относительно количества записей. Я хочу взять эти даты и сделать их в одну запись последовательно.

Например, если protocolID: 0388813 subjectID: 0001 имеет 4 записи в этом столбце и imgDate1 этих записей, где 1/1/2011, 6/30/1995, 3/11/2012, 1/1/2000

Я хотел бы вернуться, что в качестве

Protocol ID: 0388813 subjectID: 0001 DATE1: 6/30/1995 Дата2: 1/1/2000 Date3: 1/1/2011 Date4: 03/11/2012

Мысли о том, как это сделать в Access?

+1

Существует одно потенциальное препятствие для достижения вашего решения: вы говорите, что «нет ограничений относительно того, сколько записей разрешено [на одного пациента]», но таблицы доступа и запросы ограничены 255 столбцами, поэтому, если какой-либо [protocolID] + [subjectID] имеет более 253 записей в [tbl_event], тогда Access не сможет произвести желаемый результат. –

+0

Спасибо. Нет теоретического предела, но существует практический предел в 30 или около того. Так что это не проблема. – tferr85

+0

Хорошо, хорошо. Еще одна точка разъяснения: ваши данные образца показывают даты из хронологического порядка (предположительно перечисленные по порядку по идентификатору), и желаемый результат показывает [Date1], [Date2] ... в хронологическом порядке. Изготовление [Date1], [Date2] ... в [ID] порядке - намного проще, чем производить их в хронологическом порядке. Это абсолютное требование? –

ответ

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 

В этом случае мы cá п изменить, что немного, чтобы дать нам наши (возможные) имена столбцов:

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

Thats amazing, спасибо! – tferr85

Смежные вопросы