Как смоделировать UNPIVOT в Access 2010? - PullRequest
9 голосов
/ 31 августа 2011

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 ]

11 голосов
/ 31 августа 2011

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

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
1 голос
/ 31 августа 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
0 голосов
/ 10 марта 2017
  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, чтобы это работало.Но если это разовая вещь, это может быть путь.

...