从表中获取每个单元格的X和Y坐标,并转换为sql server中的新表

时间:2017-02-07 15:00:25

标签: sql-server matrix coordinates unpivot

我正在尝试为矩阵表构建查询,该表具有如下模式:

ID           1           2           3
----------- ----------- ----------- -----------
1           13          32          55
2           30          75          129

我想根据其坐标(行号和列号)获取单元格的位置,以创建一个包含字段row_num,col_num和value

的新表

在给出的示例中,此查询应返回:

row_num col_num value
------- ------- -----------
1       1       13
2       1       30
1       2       32
2       2       75
1       3       55
2       3       129

查询必须获取每个单元格的值并返回其位置X和Y. 我尝试过不同的方法而没有成功。我尝试使用UNPIVOT,但它没有向我显示正确的信息。

非常感谢任何建议!

更新: 我添加了一个列whit行号

3 个答案:

答案 0 :(得分:2)

您需要取消数据并生成行号。以下是使用CROSS APPLY

的一种方法
select Row_number()over(partition by col_num order by ID) as row_num,
       col_num,
       value
from yourtable 
cross apply(values ([1],'1'),([2],'2'),([3],'3')) tc (value,col_num)

要使用unpivot尝试这样做

select Id,col_num,value
from Yourtable
unpivot
(
  value
  for col_num in ([1], [2], [3])
) u;

答案 1 :(得分:1)

假设您确实有一个指定排序的列,您可以按以下方式进行计算:

select dense_rank() over (order by ??) as row_num,
       v.col_num, v.val
from matrix m cross apply
     (values (m.col1, 1), (m.col2, 2), (m.col3, 3)
     ) v(val, col_num);

SQL表代表无序集。 ??用于指定排序的列。如果已经row_num,那么您就不需要dense_rank()

答案 2 :(得分:1)

更新问题

Declare @YourTable table (ID int,[1] int,[2] int,[3] int)
Insert Into @YourTable values
(1,13,32,55),
(2,30,75,129)

Select A.ID as row_nu,
      ,B.*
 From  @YourTable A
 Cross Apply (
               values (1,A.[1])
                     ,(2,A.[2])
                     ,(3,A.[3])
             ) B (col_num,value)
 Order by B.col_num,A.ID

返回

row_num col_num value
1       1       13
2       1       30
1       2       32
2       2       75
1       3       55
2       3       129
  

编辑 - 请求UnPivot

Select ID as row_num ,col_num,value
 From  @Yourtable 
 UnPivot (Value for col_num in ([1], [2], [3]) ) B
 Order By 2,1