Разверните несколько столбцов метрики в 2 разных столбца и введите метку для отслеживания имени столбца для обоих столбцов.
Источник
id value_a1 value_a2 value_a3 value_a4 value_b1 value_b2 value_b3 value_b4
1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1
3 1 1 1 1 1 1 1
цель
id value1 value1label value2 value2label
1 1 value_a1 1 value_b1
1 1 value_a2 1 value_b2
1 1 value_a3 1 value_b3
1 1 value_a4 1 value_b4
2 1 value_a1 1 value_b1
2 1 value_a2 1 value_b2
2 1 value_a3 1 value_b3
2 1 value_a4 1 value_b4
3 1 value_a1 1 value_b1
3 1 value_a2 1 value_b2
3 1 value_a3 1 value_b3
3 1 value_a4 1 value_b4
Я записал запрос:
SELECT ID value1,
value1label,
value2,
value2label,
FROM
(SELECT id,
valuea1,
valuea2,
valuea3,
valuea4,
valueb1,
valueb2,
valueb3,
valueb4
FROM TABLE) P UNPIVOT (value1
FOR value1label IN (valuea1,valuea2,valuea3,valuea4))AS UNPVT UNPIVOT (value2
FOR value2label IN (valueb1,valueb2,valueb3,valueb4))AS UNPVT1
но проблема заключается в том, что value1label и value2label не синхронизированы, как в a1 - b1, и использование порядка на любом нарушает порядок. если я заказываю на value1label, он идет от a1, затем b1, а затем b2,b3 и так далее.
использование объединения со значением unpivot для каждой метки также приводит к нулевым значениям, что нежелательно, так как увеличивает количество строк
любой может помочь мне с этим
ps рассматривает a1,a2,a3,a4 как псевдоним заголовка столбца для value_a1,value_a2,value_a3,value_a4. То же самое относится и к b1, b2,b3, b4, для простоты я выбрал эти значения.
1 ответ
Вы не указали, какую версию SQL Server вы используете, но вы можете отключить пары данных value_a1
/value_b1
с помощью CROSS APPLY
вместо UNPIVOT.
Если вы используете SQL Server 2008+, вы можете использовать предложение VALUES с CROSS APPLY, но вы также можете использовать UNION ALL:
select id, value1, value1label, value2, value2label
from yourtable
cross apply
(
select value_a1, 'value_a1', value_b1, 'value_b1' union all
select value_a2, 'value_a2', value_b2, 'value_b2' union all
select value_a3, 'value_a3', value_b3, 'value_b3' union all
select value_a4, 'value_a4', value_b4, 'value_b4'
) c (value1, value1label, value2, value2label);
Смотрите SQL Fiddle с демонстрацией. Это приводит ваши данные в те же строки, что и вам:
| ID | VALUE1 | VALUE1LABEL | VALUE2 | VALUE2LABEL |
|----|--------|-------------|--------|-------------|
| 1 | 1 | value_a1 | 1 | value_b1 |
| 1 | 1 | value_a2 | 1 | value_b2 |
| 1 | 1 | value_a3 | 1 | value_b3 |
| 1 | 1 | value_a4 | 1 | value_b4 |