Как имитировать UNPIVOT в Access?

UNPIVOT доступен в MS SQL-Server 2005, но, насколько я знаю, не в MS Access 2010. Как это можно реализовать с помощью встроенных средств? Например, у меня есть таблица

ID | A | B | C | Key 1 | Key 2 | Key 3
---------------------------------------
 1 | x | y | z |     3 |   199 |   452
 2 | x | y | z |    57 |   234 |   452

и хотите иметь таблицу, как

ID | A | B | C | Key
--------------------
 1 | x | y | z |   3
 2 | x | y | z |  57
 1 | x | y | z | 199
 2 | x | y | z | 234
 2 | x | y | z | 452

Ключ 452 — это особый случай. В настоящее время я делаю ротацию в OLEDB/ATL C++. Хотя это достаточно быстро, мне все еще любопытно. Какая здесь самая эффективная инструкция SQL для Access 2010?


person Andreas Spindler    schedule 31.08.2011    source источник


Ответы (3)


Этот запрос...

SELECT ID, A, B, C, [Key 1] AS key_field
FROM tblUnpivotSource
UNION ALL
SELECT ID, A, B, C, [Key 2] AS key_field
FROM tblUnpivotSource
UNION ALL
SELECT ID, A, B, C, [Key 3] AS key_field
FROM tblUnpivotSource;

... возвращает этот набор записей (используя значения таблицы примера как tblUnpivotSource) ...

ID A B C key_field
-- - - - ---------
 1 x y z         3
 2 x y z        57
 1 x y z       199
 2 x y z       234
 1 x y z       452
 2 x y z       452
person HansUp    schedule 31.08.2011

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

SELECT ID, A, B, C, [Key 1] As key
FROM Table
WHERE [Key 1] = 3

UNION ALL

SELECT ID, A, B, C, [Key 1] As key
FROM Table
WHERE [Key 1] = 57

UNION ALL

SELECT ID, A, B, C, [Key 2] As key
FROM Table
WHERE [Key 2] = 199

UNION ALL

SELECT ID, A, B, C, [Key 2] As key
FROM Table
WHERE [Key 2] = 234

UNION ALL

SELECT ID, A, B, C, [Key 3] As key
FROM Table
WHERE [Key 3] = 452
person Taryn    schedule 31.08.2011
comment
Значит, универсального решения нет? Мы должны использовать оператор, зависящий от данных? - person Andreas Spindler; 31.08.2011
comment
@Андреас, нет быстрого способа сделать это с доступом, который является частью его падения. - person Taryn; 31.08.2011
comment
UNION удалит неразличимые значения - зачем использовать UNION ALL? - person inetphantom; 11.09.2018
comment
@inetphantom Если вы хотите DISTINCT, используйте UNION. Это будет зависеть от вашей ситуации и потребностей. - person Taryn; 11.09.2018

  1. Вы можете создать вспомогательную таблицу со всеми именами столбцов в качестве значений (можно использовать excel, скопируйте первую строку вашей таблицы, чтобы преуспеть> вставить специальный> транспонировать)

  2. Создайте в своей таблице столбец с автоинкрементом и проиндексируйте этот столбец.

  3. Создайте новый запрос перекрестного соединения, как показано ниже.

SELECT ID, A, B, C
       , AUX_TABLE.KEY_FIELD
       , DLookUp("[" & [AUX_TABLE].[KEY_FIELD] & "]","TABLE","[ID] = " & [TABLE].[ID]) AS KEY_VALUE
FROM TABLE, AUX_TABLE;

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

person Vinicius Sousa    schedule 10.03.2017