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