voltear volteadas salen programa porque para las invertir girar fotos espejo efecto como automaticamente app sql sql-server algorithm matrix

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.