将多个度量标准列拆分为2个不同的列,并引入标签以跟踪两列的列名称

时间:2013-12-12 11:58:55

标签: sql sql-server sql-server-2008-r2 unpivot

来源

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中不同步,并且在任何一个上使用order会中断排序。 如果我在value1label上订购它从a1然后是b1然后是b2,b3等等。

对每个标签使用带有unpivot值的union会导致空值,这不是所希望的,因为它会增加行数

任何人都可以帮助我这个

p.s将a1,a2,a3,a4视为value_a1,value_a2,value_a3,value_a4的列标题的别名 b1,b2,b3,b4的情况也是如此  为简单起见,我选择了那些价值观。

1 个答案:

答案 0 :(得分:0)

您没有指定正在使用的SQL Server版本,但您可以使用value_a1而不是UNPIVOT来取消数据对value_b1 / CROSS APPLY

如果您使用的是SQL Server 2008+,那么您可以将CRUES子句与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 with Demo。这会将您的数据放入您需要的相同行中:

| 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 |