如何将表格旋转45度并将结果保存到另一个表格中?
我有一张桌子。
--------- | a | b | --------- | a | b | ---------
我想旋转它45度(顺时针或逆时针),并保存到另一个表。 例如,如果我逆时针旋转45度,它将是:
------------- | b | | | ------------- | a | b | | ------------- | a | | | -------------
另一个例子,当我旋转
------------- | a | b | c | ------------- | d | e | f | ------------- | g | h | i | -------------
它会改变
--------------------- | c | | | | | --------------------- | b | f | | | | --------------------- | a | e | i | | | --------------------- | d | h | | | | --------------------- | g | | | | | ---------------------
如何在SQL
做到这一点?
一个完整的工作例子(对于SQL Server 2005+)
如果你需要它的另一个系统,下面的拼图碎片等值
- ROW_NUMBER()
- DENSE_RANK()
- UN /枢轴
你可以从其他的Stackoverflow的问题find相应的东西。 例如,前两个得到了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
如果您需要将其任意应用到任何表 – 使用dynamicSQL来生成上面显示的模式。
不应该表
--------- | a | b | --------- | a | b | ---------
逆时针旋转45度是这样的?
------------- | | b | | ------------- | a | | b | ------------- | | a | | -------------
和
------------- | a | b | c | ------------- | d | e | f | ------------- | g | h | i | -------------
就像是:
--------------------- | | | c | | | --------------------- | | b | | f | | --------------------- | a | | e | | i | --------------------- | | d | | h | | --------------------- | | | g | | | ---------------------
没有简单的方法直接在SQL中执行此操作。
我build议你将结果导入到不同的编程环境,比如Java,PHP,Python或者任何其他的,在这种情况下解决问题,然后(如果需要的话)把结果放回到DB中。
使用CROSS APPLY和PIVOT运算符的SQLServer2008 +的选项
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])
演示SQLFiddle