2017-08-17 21 views
0

下面我有一个表时: -列在SQL Server 2012中使用排unpivot的没有任何标识

X_Q1 | X_Q2 | X_Q3 | X_Q4 | Y_Q1 | Y_Q2 | Y_Q3 | Y_Q4 
---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- 
4500 | 3400 | 4600 | 3456 | 3435 | 7643 | 3214 | 43434 

脚本:

Create table #Temp 
(
    X_Q1 int, 
    X_Q2 int, 
    X_Q3 int, 
    X_Q4 int, 
    Y_Q1 int, 
    Y_Q2 int, 
    Y_Q3 int, 
    Y_Q4 int 
    ) 

insert into #Temp values(4500,3400,4600,3456,3435,7643,3214,43434) 

select * from #Temp 
drop table #Temp 

我想在下面的格式输出: -

Code |  X | Y 
---- | ---- | ---- 
Q1 | 4500 | 3435 
Q2 | 3400 | 7643 
Q3 | 4600 | 3214 
Q4 | 3456 | 43434 
+0

既不PIVOT也不UNPIVOT需要任何ID。你有没有试过*写一个UNPIVOT查询?编写一个返回代码和值列的查询很容易,其中'Code'是原始列的名称。尽管如此,UNPIVOT不会解析列名。你发布的内容并不是无意义的。 –

回答

0

PIVOT和UNPIVOT不需要ID或列的其他独特的组合。你可以随便写:

select code, value 
from (
     select   
      X_Q1, X_Q2, X_Q3, X_Q4, 
      Y_Q1, Y_Q2, Y_Q3, Y_Q4 
     from #temp 
    ) p 
    unpivot 
    (
     Value for code in 
     (
      X_Q1, X_Q2, X_Q3, X_Q4, 
      Y_Q1, Y_Q2, Y_Q3, Y_Q4 
     ) 
    ) as upvt 

的数据逆转置成:

code value 
X_Q1 4500 
X_Q2 3400 
X_Q3 4600 
X_Q4 3456 
Y_Q1 3435 
Y_Q2 7643 
Y_Q3 3214 
Y_Q4 43434 

所需输出虽然需要解析的代码分成两个单独的列,并PIVOT再次荷兰国际集团向X和Y转换成列。 PIVOT始终与聚合功能一起使用。在你的表只有一行的微不足道的情况下,这并不重要。最有可能的,虽然,你现在需要一个ID,以避免聚集多个行值到一个:由ROW_NUMBER() over (order by (select null))产生

with xy as (
    select 
     ID, 
     left(code,1) as col, 
     SUBSTRING(code,3,10) as code, 
     value 
    from (
      select   
       ROW_NUMBER() over (order by (select null)) as ID, 
       X_Q1, X_Q2, X_Q3, X_Q4, 
       Y_Q1, Y_Q2, Y_Q3, Y_Q4 
      from #temp 
     ) p 
     unpivot 
     (
      Value for code in 
      (
       X_Q1, X_Q2, X_Q3, X_Q4, 
       Y_Q1, Y_Q2, Y_Q3, Y_Q4 
      ) 
     ) as upvt 
) 
select 
    ID,code, [X],[Y] 
from xy 
PIVOT( 
    sum(value) 
    for col in ([X],[Y]) 
) as pvt 
order by ID 

行ID。 xy CTE用于将代码拆分为带有X,Y值和新的code字段的col字段。

使用X,Y作为新的字段名称再次对此结果进行PIVOT处理。

结果是:

ID code X  Y 
1 Q1  4500 3435 
1 Q2  3400 7643 
1 Q3  4600 3214 
1 Q4  3456 43434