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

UNPIVOT доступно в MS SQL-Server 2005, но AFAIK не в 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 здесь?

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

к сожалению, нет простого способа сделать это с доступом. Вы можете сделать это с помощью 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

  1. вы можете создать вспомогательную таблицу с именами столбцов в качестве значений (можно использовать excel скопируйте первую строку таблицы в 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 чтобы это работало. Но если это один раз-что это может быть способом пойти.