我正在尝试为矩阵表构建查询,该表具有如下模式:
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行号
答案 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