如何将表旋转45度并将结果保存到另一个表中?

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+)
如果您需要它用于另一个系统,下面的拼图有相应的部分

  • ROW_NUMBER()
  • DENSE_RANK()
  • UN /枢轴

您可以从其他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生成上面显示的模式.

  • 这是我在SO上看到的最聪明的事情之一.即使是纯粹的理论价值,我也希望在博客中看到这一点,并将其概括为45度的倍数.辉煌的理查德.对不起,如果我听起来像一个粉丝男孩,但我真的很惊讶这:) (14认同)
  • 谢谢理查德,你真的是一个SQL大师! (6认同)
  • 这太荒谬了. (4认同)
  • 要获得ypercube的输出,请将`targetCol = ROW_NUMBER()..更改为`targetCol = ABS(3 - (row + col-1)) - 1 + 2*ROW_NUMBER()..`如果灵感,我会添加更多评论有助于扩大答案 (2认同)

ype*_*eᵀᴹ 9

不应该是表

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

  • 不,但我无法在评论中粘贴这些表格.在尝试回答之前,我们应该清楚地描述问题,不是吗? (24认同)
  • ypercube - 再迈一步(向左冲)你会有问题结构 (5认同)
  • 这不是答案. (4认同)
  • 但是这种方式(如OP所建议的)留下了旋转8度45度的问题,不会让你回到原来的位置(表格). (4认同)
  • 是的,"轮换"这个词被选中了 (3认同)