从 table 获取每个单元格的 X 和 Y 坐标,并在 sql 服务器中转换为新的 table

Get X and Y coordinates of each cell from a table and transform into a new table in sql server

我正在尝试为具有如下架构的矩阵 table 构建查询:

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

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

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

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

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

非常感谢任何建议!

更新: 我添加了一个带行号的列[​​=16=]

您需要逆透视数据并生成行号。这是使用 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;

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

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().

更新后的问题

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

Returns

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

EDIT - As requested 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