Объединение строк данных в MSAccess - PullRequest
0 голосов
/ 16 августа 2011

У меня есть несколько таблиц в ms доступе, которые мне нужно сжать, так как в базе данных слишком много полей.В настоящее время есть что-то вроде:

ID     Class     Date     
123    101       1/1/1111
123    202       2/2/2222
123    303       3/3/3333
456    111       4/4/4444
456    222       5/5/5555
456    333       6/6/6666

Что мне нужно, чтобы таблицы выглядели так:

ID     Class(1)  Date(1)    Class(2)    Date(2)    Class(3)    Class(3) ..... etc
123    101       1/1/1111   202         2/2/2222   303         3/3/3333 ..... etc
456    111       4/4/4444   222         5/5/5555   333         6/6/6666 ..... etc

Не существует стандартного количества записей по ID инекоторые данные могут быть повторены.Есть ли способ сделать это?

Спасибо за ответ.

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Я дам вам представление о том, как я мог бы подойти к проблеме ... Это не абстрагируемый / многократно используемый функциональный подход - просто практическая, готовая вещь.

0) скопируйте старую таблицу для резервного копирования.

1) присвойте исходной таблице уникальный идентификатор записи.Добавьте столбец в дизайн таблицы под названием «pk», нажмите маленькую кнопку ключа.Убедитесь, что он заполняется автоматически увеличивающимся целым числом после сохранения.

2) создайте новую таблицу со столбцами: pk, id, class1, date1, class2, date2, ..., classn, daten.Вы можете сделать

select id, count(class) from table order by count(class) desc.

для быстрого просмотра того, сколько полей вам нужно создать.

2) сделать вставку # 1

Insert into newtable (pk, id, class1, date1) 
select min(pk) id, class, date from oldtable

3) сделатьудалить # 1

Delete from oldtable
where pk in(select pk from newtable)

4) сделать обновление # 1

Update newtable a
set a.pk = b.pk, a.class2 = b.class, a.date2 = b.date
FROM (select min(pk) pk, id, class, date from oldtable) b

5) удалить # 2 (повторить шаг 3)

6) сделать обновление # 2(повторите шаг 4, но измените 2 на 3).Т.е.:

Update newtable a
set a.pk = b.pk, a.class3 = b.class, a.date3 = b.date
FROM (select min(pk) pk, id, class, date from oldtable) b

... и так далее до тех пор, пока в вашей старой таблице больше не останется записей.

Как я уже сказал - это не может быть использовано повторно, у вас естьизменять его в каждом цикле и т. д. Если вы знаете, как использовать наборы записей ADO и т. д., вы можете преобразовать это в нечто более абстрактное / многократно используемое, но не похоже, что вы собираетесь использовать его больше, чемоднажды.

удачи.

1 голос
/ 16 августа 2011

Я думаю, что вы получили примеры назад (что у вас есть, и что вам нужно).

Правильный формат таблицы для этих данных будет вертикальным (как в первом примере), а не горизонтальным. (Если вы хотите отобразить его горизонтально, вы можете сделать это с помощью запроса для целей представления, но на самом деле таблица не должна быть структурирована таким образом.)

Чтобы преобразовать ваш горизонтальный формат, используйте один из следующих способов:

INSERT INTO myNewTable
(ID, class, date)

SELECT
   ID,
   Class(1),
   Date(1)
FROM
   myOldTable
WHERE
   Class(1) IS NOT NULL

UNION

(ID, class, date)
SELECT
   ID,
   Class(2),
   Date(2)
FROM
   myOldTable
WHERE
   Class(2) IS NOT NULL

UNION

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...