Jus*_*ner 40 sql sql-server algorithm matrix
我有一张桌子.
---------
| a | b |
---------
| a | b |
---------
Run Code Online (Sandbox Code Playgroud)
我想将它旋转45度(顺时针或逆时针)并将其保存到另一张桌子中.例如,如果我逆时针旋转45度,它将是:
-------------
| b | | |
-------------
| a | b | |
-------------
| a | | |
-------------
Run Code Online (Sandbox Code Playgroud)
另一个例子,当我旋转
-------------
| a | b | c |
-------------
| d | e | f |
-------------
| g | h | i |
-------------
Run Code Online (Sandbox Code Playgroud)
它将变为
---------------------
| c | | | | |
---------------------
| b | f | | | |
---------------------
| a | e | i | | |
---------------------
| d | h | | | |
---------------------
| g | | | | |
---------------------
Run Code Online (Sandbox Code Playgroud)
怎么做SQL?
Ric*_*iwi 65
一个完整的工作示例(对于SQL Server 2005+)
如果您需要它用于另一个系统,下面的拼图有相应的部分
您可以从其他Stackoverflow问题中找到等效项.例如,Oracle和DB2很好地支持前两个.
create table t45 (id int identity, colA char(1), colX char(1), colZ char(1))
insert t45 select 'a','b','c'
insert t45 select 'd','e','f'
insert t45 select 'g','h','i'
GO
select [1],[2],[3],[4],[5] -- for N columns, this goes to N*2-1
from
(
select value,
targetRow = row+col-1,
targetCol = ROW_NUMBER() over (partition by row+col-1 order by row)
from
(
select *,
row = DENSE_RANK() over (order by id),
col = ROW_NUMBER() over (partition by id order by
CASE source when 'colA' then 3 -- number in reverse
when 'colX' then 2
when 'colZ' then 1 end)
from t45
unpivot (value for source in (colA,colX,colZ)) upv
) x
) p -- for N columns, this goes to N*2-1
pivot (max(value) for targetCol in ([1],[2],[3],[4],[5])) pv
order by targetRow
Run Code Online (Sandbox Code Playgroud)
如果需要任意将其应用于任何表 - 使用动态SQL生成上面显示的模式.
不应该是表
---------
| a | b |
---------
| a | b |
---------
Run Code Online (Sandbox Code Playgroud)
逆时针旋转45度是这样的吗?
-------------
| | b | |
-------------
| a | | b |
-------------
| | a | |
-------------
Run Code Online (Sandbox Code Playgroud)
和
-------------
| a | b | c |
-------------
| d | e | f |
-------------
| g | h | i |
-------------
Run Code Online (Sandbox Code Playgroud)
就像是:
---------------------
| | | c | | |
---------------------
| | b | | f | |
---------------------
| a | | e | | i |
---------------------
| | d | | h | |
---------------------
| | | g | | |
---------------------
Run Code Online (Sandbox Code Playgroud)