SQL-запрос: новые столбцы для данных с некоторыми критериями соответствия

#sql #ms-access #multiple-columns

#sql #ms-access #несколько столбцов

Вопрос:

Я работаю с запросом, который извлекает данные из таблицы и упорядочивает их способом, аналогичным приведенному ниже:

 Query1

BldID  UnitID   Res1

1      201      John Smith   
1      201      Jane Doe
1      202      Daniel Jones
1      202      Mark Garcia
2      201      Maria Lee
2      201      Paul Williams
2      201      Mike Jones
 

Я хотел бы изменить вывод запроса в SQL / Design, чтобы каждый житель, который совместно использует здание / единицу, отображался как новый столбец в той же строке, как показано ниже:

 BldID  UnitID   Res1          Res2           Res3 
1      201      John Smith    Jane Doe
1      202      Daniel Jones  Mark Garcia
2      201      Maria Lee     Paul Williams  Mike Jones    
 

Я прошу прощения, если это грубая / недостаточно информации, но любая помощь будет принята с благодарностью.

Ответ №1:

Вы можете попробовать использовать conditional aggregation

 with cte as
(
select *, row_number() over(partition by BldID,UnitID order by Res1) as rn
from tablename
)

select BldID,UnitID,
       max(case when rn=1 then Res1 end) as Res1,
       max(case when rn=2 then Res1 end) as Res2,
       max(case when rn=3 then Res1 end) as Res3
from cte
group by BldID,UnitID
 

Комментарии:

1. Спасибо за ваш ответ @Fahmi. Полагаю, мне следовало уточнить больше. Резидентное поле — это, по сути, все уникальные записи. У каждого резидента есть другое имя. Повлияет ли это на результат, и если да, то что я буду использовать для выбора уникальных пользователей для достижения того же результата?

2. @llOmni, не могли бы вы, пожалуйста, пересмотреть свой образец, чтобы указать на эту уникальность и лучше сформулировать, что требуется? При этих двух условиях получение сплошных динамических столбцов из MSAcess таким способом может потребовать больше операторов, чем вы привыкли, и, вероятно, использует подзапрос для получения правильных результатов.

3. @JaazCole Прошу прощения, поскольку изначально он не был отформатирован таким образом. Я удалил общие идентификаторы A, B, C с некоторыми общими именами в формате вывода, который я ищу. Что касается уточняющего утверждения, все, что я могу добавить, это то, что каждое здание / единица является уникальным объектом с несколькими жителями в каждом. 1/1 1/2 1/3, 2/1/2/2 2/3, и я пытаюсь выделить этих резидентов, поскольку сейчас все они перечислены в разделе Res1. Еще раз спасибо за помощь.

4. @llOmni, я обновил asnwer — теперь вы можете попробовать

5. @JaazCole и Fahmi Я пробовал оба ответа, и пока безуспешно. Вероятно, это с моей стороны, поскольку я все еще новичок в SQL. Faami при вводе ваших данных я получаю неверный оператор SQL. Похоже, что-то не нравится в структуре CTE. JaazCole Я буду честен, ты выше моей головы в этом вопросе. Имя таблицы как T1 и имя таблицы как T2 относятся к каким таблицам? Даже если я извлекаю данные из своего исходного запроса, должен ли я заменить это как таблицу T1 и T2, или я должен извлекать из исходной таблицы и запроса из нее? Еще раз спасибо за помощь.

Ответ №2:

Итак, опираясь на несколько разных источников, это может сработать, попробуйте вставить это в редактор запросов и посмотреть, будет ли он выполняться.

 TRANSFORM MAX(Res1)
SELECT BldID, UnitID
    , (
         SELECT COUNT(T1.Marks)
         FROM tableName AS T1
         WHERE 
             T1.BldgID = T2.BldgID AND
             T1.UnitID = T2.UnitID AND
             T1.Res1 >= T2.Res1
      ) AS Rank, Res1
FROM tableName t2
GROUP BY BldID, UnitID
PIVOT Rank; 
 

Ответ №3:

с опозданием на 2 года, но, может быть, я смогу что-то добавить, в Access мы хирурги, работающие с кухонными ножами, все должно быть сделано способом Access…

Я протестировал его с помощью этой таблицы UnitStudentBlock

BldID Идентификатор единицы Res1
1 201 Джон Смит
1 201 Джейн Доу
1 202 Дэниел Джонс
1 202 Марк Гарсия
2 201 Мария Ли
2 201 Пол Уильямс
2 201 Майк Джонс
2 201 Джулиан Гомес

Поскольку Access не имеет row_number, сначала я создал таблицу с полем автоматического увеличения, чтобы у нас могло быть что-то вроде номера строки:

 CREATE TABLE TableWithId
(
Id COUNTER,
BldID  INT,
UnitID INT,
Res1 VARCHAR(100),
ResNumber VARCHAR(100)
)
 

Затем я вставил все данные из исходной таблицы в эту вновь созданную таблицу:

 INSERT INTO TableWithId (BldID, UnitID, Res1)
SELECT * 
FROM UnitStudentBlock
ORDER BY BldID, 
         UnitID
 

Затем я обновил все, используя DCOUNT, чтобы разделить row_number:

 UPDATE TableWithId
SET ResNumber = 'Res'   Cstr(DCOUNT("*", "TableWithId", "ID >=" amp; [ID] 
                                                     amp; " AND UnitId = " amp; [UnitId] 
                                                     amp; " AND BldId = " amp; [BldId]))
 

И, наконец, мы можем запустить запрос, который возвращает данные:

 TRANSFORM MAX(Res1)
SELECT BldID, UnitID
FROM TableWithId
GROUP BY BldID, UnitID 
PIVOT ResNumber