Сопоставлять / сводить логические столбцы

#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!