MS Acess: объединение и транспонирование нескольких таблиц - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть несколько статических таблиц с многочисленными столбцами.Все они имеют одну общую колонку.Я хотел бы переставить каждую из этих таблиц так, чтобы имена столбцов становились строками, значения столбцов становились строками и чтобы был один «общий» столбец.Например:

+---------+---+------+-----+---------+-----+
| Table 1 |   |  x1  | x2  |   x3    | x4  |
+---------+---+------+-----+---------+-----+
|         | 1 |  5   |  4  |  alpha  |  6  |
|         | 2 |  5   |  1  |  alpha  |  5  |
|         | 3 |  8   |  4  |  alpha  |  6  |
|         | 4 |  0   |  8  |  Beta   |  1  |
|         | 5 |  10  |  3  |  Beta   |  5  |
|         | 6 |  3   |  6  |  Beta   |  4  |
|         | … | …    | …   | …       | …   |
+---------+---+------+-----+---------+-----+



+---------+---+-----+-----+---------+
| Table 2 |   | y1  | y2  |   x3    |
+---------+---+-----+-----+---------+
|         | 1 |  2  |  7  |  Alpha  |
|         | 2 |  1  |  4  |  Beta   |
|         | … | …   | …   | …       |
+---------+---+-----+-----+---------+


+--------------+----+---------+------------+--------------+--------------+
| RESULT TABLE |    |   x3    | Field Name | Column Value | Source Table |
+--------------+----+---------+------------+--------------+--------------+
|              | 1  | Alpha   | x1         |  5           | Table 1      |
|              | 2  | Alpha   | x2         |  4           | Table 1      |
|              | 3  | Alpha   | x4         |  6           | Table 1      |
|              | 4  | Alpha   | x1         |  5           | Table 1      |
|              | 5  | Alpha   | x2         |  1           | Table 1      |
|              | 6  | Alpha   | x4         |  5           | Table 1      |
|              | 7  | Alpha   | x1         |  8           | Table 1      |
|              | 8  | Alpha   | x2         |  4           | Table 1      |
|              | 9  | Alpha   | x4         |  6           | Table 1      |
|              | 10 | Beta    | x1         |  0           | Table 1      |
|              | 11 | Beta    | x2         |  8           | Table 1      |
|              | 12 | Beta    | x4         |  1           | Table 1      |
|              | 13 | Beta    | x1         |  10          | Table 1      |
|              | 14 | Beta    | x2         |  3           | Table 1      |
|              | 15 | Beta    | x4         |  5           | Table 1      |
|              | 16 | Beta    | x1         |  3           | Table 1      |
|              | 17 | Beta    | x2         |  6           | Table 1      |
|              | 18 | Beta    | x4         |  4           | Table 1      |
|              | 19 |  Alpha  | y1         |  2           | Table 2      |
|              | 20 |  Alpha  | y2         |  7           | Table 2      |
|              | 21 | Beta    | y1         |  1           | Table 2      |
|              | 22 | Beta    | y2         |  4           | Table 2      |
|              | …  | …       | …          | …            | …            |
+--------------+----+---------+------------+--------------+--------------+

В приведенном выше примере x3 - это общий столбец, который я хотел бы сохранить.Все остальные столбцы превращаются в строки с соответствующими значениями.

Возможно ли это вообще в SQL-доступе?Я новичок и не могу найти решение, так как мне нужно сначала объединить два tbales, а затем как-то повернуть его, за исключением столбца x3.

Выше приведен только пример, в действительности каждая таблица может иметь многостолбцы, поэтому я хотел бы попробовать сделать это динамически для любого количества столбцов

РЕДАКТИРОВАТЬ:

Я предложил динамическое решение.Я могу использовать VBA для создания запроса:

select x3 as x3,  x1 as [field name], [x1] as [column value], 'Table 1' as [Source Table]
UNION ALL
select x3 as x3,  x2 as [field name], [x2] as [column value], 'Table 1' as [Source Table]
...

Это позволит получить первую таблицу в правильном формате.

Затем я могу повторить для второй таблицы и объединить оба, чтобы получить результат.

Однако на практике в моих таблицах много столбцов, поэтому эта строка запроса очень быстро становится очень большой, и, к сожалению, Microsoft Access не может обрабатывать длинные строки SQL, поэтому выдает ошибку, что запрос слишком сложен.Не вижу другого обходного пути ...

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Сначала вам нужно будет отключить обе таблицы

/*UNPIVOT TABLE 1*/

SELECT  ID
       ,X3
       ,FIELD_NAME
       ,COLUMN_VALUE
       ,SOURCE_TABLE = 'TABLE 1'
INTO ##TB1
FROM 
    (SELECT ID,X1,X2,X3,X4
     FROM TABLE_1) AS P
UNPIVOT (COLUMN_VALUE 
         FOR FIELD_NAME IN (X1 , X2, X4)
        ) AS UNPVT

/*UNPIVOT TABLE 2*/

SELECT  ID 
       ,X3
       ,FIELD_NAME
       ,COLUMN_VALUE
       ,SOURCE_TABLE = 'TABLE 2'
INTO ##TB2
FROM 
    (SELECT ID,Y1,Y2,X3
     FROM TABLE_2) AS P
UNPIVOT (COLUMN_VALUE 
         FOR FIELD_NAME IN (Y1,Y2)
        ) AS UNPVT

Затем используйте Union на обоих

/*DISTINCT UNION BOTH TABLES*/

    SELECT * 
    FROM ##TB2

    UNION

    SELECT * 
    FROM ##TB1

Если вы хотите проверить microsoft Pivot и unpivot

Также, если вы хотите повысить производительность и знаете, что в объединениях нет повторяющихся результатов, я рекомендую вам использовать UNION ALL Union

0 голосов
/ 28 сентября 2018

Используйте apply для отключения и union all:

select v.x3, v.col, v.val, v.table
from t1 cross apply
     (values ('table1', 'x1', x1, x3),
             ('table1', 'x2', x2, x3),
             . . .
     ) v(table, col, val)
union all
select v.x3, v.col, v.val, v.table
from t2 cross apply
     (values ('table2', 'x1', x1, x3),
             ('table2', 'x2', x2, x3),
             . . .
     ) v(table, col, val)
. . . 

Обратите внимание, что для работы этого (или любого другого метода) типы столбцов должны быть совместимы.Вам может потребоваться преобразовать в строки, чтобы это работало.

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