sql - volteadas - programa para girar fotos automaticamente
¿Cómo rotar una mesa 45 grados y guardar el resultado en otra mesa? (4)
¿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 | | |
---------------------
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 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.
Opción para SQLServer2008 + con operadores CROSS APPLY y PIVOT
CREATE TABLE dbo.test77
(
id int IDENTITY,
colA char(1),
colB char(1),
colC char(1)
)
INSERT dbo.test77
VALUES(''a'',''b'',''c''),
(''d'',''e'',''f''),
(''g'',''h'',''i'')
SELECT [1], [2], [3], [4], [5]
FROM (
SELECT COALESCE(o.colA, o.colB, o.colC) AS Val,
''Col'' + CAST(ROW_NUMBER() OVER (ORDER BY id) AS nvarchar(1)) AS ColName
FROM dbo.test77 t CROSS APPLY (
VALUES(colA, NULL, NULL),
(NULL, colB, NULL),
(NULL, NULL, colC)
) o(colA, colB, colC)
) p
PIVOT (
MAX(Val) FOR ColName IN ([Col1], [Col2], [Col3], [Col4], [Col5], [Col6], [Col7], [Col8], [Col9])
) pvt CROSS APPLY (
VALUES ([Col3], NULL, NULL, NULL, NULL),
([Col2], [Col6], NULL, NULL, NULL),
([Col1], [Col5], [Col9], NULL, NULL),
([Col4], [Col8], NULL, NULL, NULL),
([Col7], NULL, NULL, NULL, NULL)
) o([1], [2], [3], [4], [5])
Demostración en SQLFiddle
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.