SQL преобразовывает имена столбцов в значения строк - PullRequest
0 голосов
/ 28 августа 2018

У меня есть таблица, организованная следующим образом:

Account Location Measure1 Measure2 Measure3
-------------------------------------------
123a     A       100       20%      5
234b     A        75       80%      8

Я хочу создать записи следующим образом:

Account Location Measure    Value
-----------------------------------
123a     A       Measure1    100
123a     A       Measure2    20%
123a     A       Measure3    5
234b     A       Measure1    75
234b     A       Measure2    80%
234b     A       Measure3    8

Поскольку мои имена мер являются заголовками столбцов, а не значениями столбцов под заголовком «Мера», я не могу повернуть данные в имени меры.

Я знаю, как запросить имена столбцов, выполнив запрос INFORMATION_SCHEMA.COLUMNS. Но я не уверен, что делать дальше. Я не хочу делать объединение, потому что есть более 100 столбцов мер и таблица велика.

Единственная помощь, которую мне удалось найти в Интернете, - это разбиение значений в одном столбце (например, строки, разделенные точкой с запятой) на несколько записей. UNPIVOT не работает, потому что снова имя меры не является значением в столбце, это заголовок столбца.

Буду признателен за любую помощь, которую вы можете оказать мне

1 Ответ

0 голосов
/ 28 августа 2018

Простой метод, который работает в большинстве баз данных, использует union all:

select account, location, 'Measure1', Measure1
from t
union all
select account, location, 'Measure2', Measure2
from t
union all
select account, location, 'Measure3', Measure3
from t;

В базах данных, поддерживающих боковые объединения, существует более удобный синтаксис, например:

select t.account, t.location, v.measure, v.value
from t cross join lateral  -- or maybe cross apply
     (values ('Measure1', t.Measure1), ('Measure2', t.Measure2), ('Measure3', t.Measure3)
     ) v(measure, value);
...