从 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
我正在尝试为具有如下架构的矩阵 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