sql - voltear - ¿Cómo rotar una mesa 45 grados y guardar el resultado en otra mesa?




voltear fotos espejo (3)

Tengo una mesa

---------
| a | b |
---------
| a | b |
---------

Quiero girarlo 45 grados (en sentido horario o antihorario) y guardarlo en otra mesa. Por ejemplo, si lo giro 45 grados en sentido antihorario, será:

-------------
| b |   |   |
-------------
| a | b |   |
-------------
| a |   |   |
-------------

Otro ejemplo, cuando giro

-------------
| a | b | c |
-------------
| d | e | f |
-------------
| g | h | i |
-------------

Cambiará a

---------------------
| c |   |   |   |   |
---------------------
| b | f |   |   |   |
---------------------
| a | e | i |   |   |
---------------------
| d | h |   |   |   |
---------------------
| g |   |   |   |   |
---------------------

¿Cómo hacer esto en SQL ?


¿No debería la mesa

---------
| a | b |
---------
| a | b |
---------

girado 45 grados en sentido antihorario, ¿sería así?

-------------
|   | b |   |
-------------
| a |   | b |
-------------
|   | a |   |
-------------

y el

-------------
| a | b | c |
-------------
| d | e | f |
-------------
| g | h | i |
-------------

algo como:

---------------------
|   |   | c |   |   |
---------------------
|   | b |   | f |   |
---------------------
| a |   | e |   | i |
---------------------
|   | d |   | h |   |
---------------------
|   |   | g |   |   |
---------------------

No hay una forma simple de hacer esto directamente en SQL.

Sugiero que importe el resultado en un entorno de programación diferente, como Java, PHP, Python o lo que sea, resuelva el problema en este contexto y luego (si es necesario) devuelva el resultado al DB.


Un ejemplo completamente funcional (para SQL Server 2005+)
Si lo necesita para otro sistema, hay equivalentes para las piezas del rompecabezas a continuación

  • numero de fila()
  • dense_rank ()
  • un / pivot

Puede encontrar los equivalentes de otras preguntas de . Por ejemplo, los dos primeros son bien compatibles con Oracle y 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

Si necesita aplicarlo arbitrariamente a cualquier tabla, use SQL dinámico para generar el patrón que se muestra arriba.





matrix