Рассмотрим следующие примеры данных в таблице под названием [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
Существует одно потенциальное препятствие для достижения вашего решения: вы говорите, что «нет ограничений относительно того, сколько записей разрешено [на одного пациента]», но таблицы доступа и запросы ограничены 255 столбцами, поэтому, если какой-либо [protocolID] + [subjectID] имеет более 253 записей в [tbl_event], тогда Access не сможет произвести желаемый результат. –
Спасибо. Нет теоретического предела, но существует практический предел в 30 или около того. Так что это не проблема. – tferr85
Хорошо, хорошо. Еще одна точка разъяснения: ваши данные образца показывают даты из хронологического порядка (предположительно перечисленные по порядку по идентификатору), и желаемый результат показывает [Date1], [Date2] ... в хронологическом порядке. Изготовление [Date1], [Date2] ... в [ID] порядке - намного проще, чем производить их в хронологическом порядке. Это абсолютное требование? –