SQL将列名称转换为行值

时间:2018-08-28 16:27:33

标签: sql arrays split unpivot

我有一个表,其组织如下:

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

因为我的度量名称是列标题,而不是名为“ Measure”的标题下的列值,所以我无法在度量名称上旋转数据。

我知道如何通过查询INFORMATION_SCHEMA.COLUMNS来查询列名。但是我不确定如何从那里继续。我不想做一个联合,因为有大约100多个度量值列,并且表很大。

我在网上只能找到的唯一帮助是将一列中的值(例如,以分号分隔的字符串)拆分为多个记录。 UNPIVOT不起作用,因为度量名称再次不是列中的值,而是列标题。

我会很感激您能给我

1 个答案:

答案 0 :(得分:0)

一种适用于大多数数据库的简单方法使用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);
相关问题