来源
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的情况也是如此 为简单起见,我选择了那些价值观。
答案 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 |