Разверните несколько столбцов метрики в 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 |
Другие вопросы по тегам