#sql #ms-access #pivot
#sql #ms-access #сводить
Вопрос:
У меня есть таблица attendance
, в которой перечислены даты собраний и посещаемость представителями 4 квадрантов:
Date N S E W
1/1/2021 T T T T
1/3/2021 F T T T
1/4/2021 F F T T
и т.д.
Я хочу найти последнюю дату, когда различные представители находились в одной комнате друг с другом:
N S E W
N 1/1/2021 1/1/2021 1/1/2021 1/1/2021
S 1/1/2021 1/3/2021 1/3/2021 1/3/2021
E 1/1/2021 1/3/2021 1/3/2021 1/4/2021
W 1/1/2021 1/3/2021 1/4/2021 1/4/2021
Я пытался использовать ПРЕОБРАЗОВАНИЕ / перекрестную вкладку, но я думаю, что мне нужно сделать ПОВОРОТ дольше, прежде чем я смогу это сделать, и PIVOT кажется невозможным в Access.
Я хотел бы услышать предложения или подходы к этому.
Комментарии:
1. какими должны быть те, у которых два одинаковых — последняя дата, которая была T?
2. Да — самая последняя дата
Ответ №1:
Хммм . , , вы можете отключить и повторно сгруппировать. Это болезненно в MS Access, но вы можете использовать:
select t1.which,
max(iif(t2.which = 'N' then date end) as N,
max(iif(t2.which = 'S' then date end) as S,
max(iif(t2.which = 'E' then date end) as E,
max(iif(t2.which = 'W' then date end) as W
from (select date, 'N' as which from t where N = 'T' union all
select date, 'S' from t where S = 'T' union all
select date, 'E' from t where E = 'T' union all
select date, 'W' from t where W = 'T'
) as t1 inner join
(select date, 'N' as which from t where N = 'T' union all
select date, 'S' from t where S = 'T' union all
select date, 'E' from t where E = 'T' union all
select date, 'W' from t where W = 'T'
) as t2
on t1.date = t2.date
group by t1.which;
Альтернативный метод не так уж плох для 4 человек, но он плохо масштабируется:
select which, max(N) as n, max(S) as s, max(E) as e, max(W) as w
from (select N as which,
date as N,
iif(S = 'T', date, null) as S,
iif(E = 'T', date, null) as E,
iif(W = 'T', date, null) as W
from t
union all
select S,
iif(N = 'T', date, null) as N,
date as S,
iif(E = 'T', date, null) as E,
iif(W = 'T', date, null) as W
from t
union all
select S,
iif(N = 'T', date, null) as N,
iif(S = 'T', date, null) as S,
date as E,
iif(W = 'T', date, null) as W
from t
union all
select S,
iif(N = 'T', date, null) as N,
iif(S = 'T', date, null) as S,
iif(E = 'T', date, null) as E,
date as W,
from t
) as tt
group by which;
Комментарии:
1. Я чувствую, что есть способ сделать это с помощью ROW_NUMBER() ….
2. @Hogan . , , определенно не в MS Access.
3. В итоге я использовал первый вариант, но использовал select * from …, а затем выполнил второй запрос перекрестной таблицы для этого, используя max(). Я думаю, что синтаксис iif был немного не в порядке, но это лучше подходило моему мозгу и позволило мне выполнить дополнительный запрос «количество раз вместе», используя тот же базовый запрос. Спасибо @GordonLinoff!