2013-08-12 6 views
-1

У меня есть следующая таблица:значения строки в столбцы

Name  Group 
John  2A 
John  1B 
Barry  2A 
Ron   1B 
Ron   2A 
Ron   2C 

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

Ожидаемый результат

Name  Group1  Group2  Group3 
John  2A   1B 
Barry  2A 
Ron   1B   2A   2C 

В этом примере я знаю, что максимальные группы являются 3. Так что я сделал столбцы Group1, GROUP2 и group3.

Относительно кросс-таблицы, но я не могу использовать перекрестную вкладку, потому что параметры значения должны быть числовыми, и у меня есть строки. По крайней мере, не в MS-Access, который я использую.

+0

почему разве вы не ожидаете, что группы будут в одних и тех же колонках? '2A' в' Group2', '1B' в' Group1' и т. Д.? – Malachi

+0

Для Рона, что решает, какое значение входит в группу 1? Непонятно, почему «1B» идет туда вместо «2A» или «2C». –

ответ

4

К сожалению, MS Access не имеет функции row_number(), чтобы легко присвоить значение каждому элементу за name. Я бы получил результат следующим образом.

Во-первых, с помощью запроса ниже вы возвращаете name, group и увеличивается число, которое назначается для каждой группы на человека:

select name, 
    group, 
    (select count(*) 
    from yourtable t1 
    where yourtable.name = t1.name 
    and yourtable.group<= t1.group) AS rw 
from yourtable; 

Этот запрос даст результат, аналогичный:

+-------+-------+----+ 
| name | group | rw | 
+-------+-------+----+ 
| John | 2A | 1 | 
| John | 1B | 2 | 
| Barry | 2A | 1 | 
| Ron | 1B | 3 | 
| Ron | 2A | 2 | 
| Ron | 2C | 1 | 
+-------+-------+----+ 

Затем вы можете использовать функцию IIF() и агрегатную функцию max() для преобразования значений из строк в столбцы:

SELECT name, 
    max(iif(rw=1, group, null)) as Group1, 
    max(iif(rw=2, group, null)) as Group2, 
    max(iif(rw=3, group, null)) as Group3 
FROM 
(
    select name, 
    group, 
    (select count(*) 
     from yourtable t1 
     where yourtable.name = t1.name 
      and yourtable.group<= t1.group) AS rw 
    from yourtable 
) d 
group by name 
order by name; 

Это даст результат:

+-------+--------+--------+--------+ 
| name | Group1 | Group2 | Group3 | 
+-------+--------+--------+--------+ 
| Barry | 2A  |  |  | 
| John | 2A  | 1B  |  | 
| Ron | 2C  | 2A  | 1B  | 
+-------+--------+--------+--------+ 

Edit: Данные в таблице не по своей сути заказанному, но если у вас есть столбец, чтобы поместить данные в нужном порядке, используя идентификатор и т.д., то вы должны быть в состоянии изменить запрос к следующему:

SELECT name, 
    max(iif(rw=1, group, null)) AS Group1, 
    max(iif(rw=2, group, null)) AS Group2, 
    max(iif(rw=3, group, null)) AS Group3 
FROM 
(
    SELECT name, 
     group, 
     (select count(*) 
     from table9 t1 
     where yourtable.name = t1.name 
     and t1.id<= yourtable.id 
     ) as rw 
    from yourtable 
) AS d 
GROUP BY name 
ORDER BY name; 

результат будет:

+-------+--------+--------+--------+ 
| name | Group1 | Group2 | Group3 | 
+-------+--------+--------+--------+ 
| Barry | 2A  |  |  | 
| John | 2A  | 1B  |  | 
| Ron | 1B  | 2A  | 2C  | 
+-------+--------+--------+--------+ 
+0

Я заметил, что порядок изменяется в первом запросе. – Rick

+0

@Rick Я не уверен, что понимаю ваш комментарий. Какой порядок вы хотите получить? – Taryn

+0

Я выполнил первый запрос, а номер rw дал номер группы, но не в правильном порядке. Я даже попытался добавить поле autonumber и включить 'order by id asc' в подзапрос. – Rick

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