Объединить несколько записей в одной таблице в доступе - PullRequest
0 голосов
/ 22 декабря 2009

Здравствуйте, я имею дело с некоторыми недружелюбными файлами импорта, которые импортируются как:

timestamp  position        name
001            2            Jon
001            3            Bob
001            1            Ann
001            4            Mike
002            1            Joe
002            2            Sue
003            1            Jeff
004            5            James
004            1            Andy
004            2            Beth
004            4            Mitch
004            3            Chris

И хотел бы создать новую таблицу, которая будет отображаться следующим образом:

timestamp  position1    position2    position3    position4     position5
001           Ann          Jon          Bob          Mike
002           Joe          Sue
003           Jeff
004           Andy         Beth         Chris        Mitch        James

Просматривая этот форум, я нашел следующее решение:

SELECT pos1.timestamp, pos1.name AS position1, pos2.name AS position2
FROM table1 AS pos1 INNER JOIN table1 AS pos2 
ON pos1.timestamp = pos2.timestamp
WHERE (((pos1.position)=1) AND ((pos2.position)=2))

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

Ответы [ 2 ]

1 голос
/ 25 декабря 2009

Ваш новый стол плохой дизайн. Что происходит, когда во входных данных присутствует шестой и седьмой человек? Также будет сложно работать, когда вам нужно будет извлечь все данные от конкретного человека, так как вам потребуется запросить пять столбцов.

1 голос
/ 22 декабря 2009

Попробуйте что-то вроде этого

TRANSFORM First(Table.[name]) AS FirstOfname
SELECT Table.[timestamp]
FROM [Table]
GROUP BY Table.[timestamp]
PIVOT Table.[position];

Я создал это с помощью мастера запросов MS Access Cross Tab.

Также взгляните на

Что такое CrossTab Query?

Немного лучшего объяснения.

  • Перейдите на вкладку «Создать».
  • Нажмите Мастер запросов.
  • Выбрать второй вариант (кросс-таблица запросов Мастер) и нажмите ОК.
  • Выберите таблицу для ввода и нажмите следующий.
  • Выберите метку времени и нажмите стрелку (одиночный), указывающий слева направо, и нажмите следующий.
  • Выберите позицию и нажмите следующее.
  • name будет оставшимся полем, Выберите Первый (по умолчанию это количество) и ударить дальше.
  • Хит финиша.

Он должен был сохранить запрос с именем Table_Crosstab (или что-то подобное). Щелкните правой кнопкой мыши и выберите вид дизайна. На кнопке просмотра выберите Sql View.

Вы должны увидеть что-то похожее на

TRANSFORM First(Table.name) AS FirstOfname
SELECT Table.timestamp, First(Table.name) AS [Total Of name]
FROM [Table]
GROUP BY Table.timestamp
PIVOT Table.position;

Из второй строки удалить

, First(Table.name) AS [Total Of name]

так что в итоге вы получите

TRANSFORM First(Table.name) AS FirstOfname
SELECT Table.timestamp
FROM [Table]
GROUP BY Table.timestamp
PIVOT Table.position;

И это должно быть. Сохраните и вы готовы.

...