使用SQL对表进行“转置”操作

4
我不知道这个操作是否有一个专门的名称,但是它类似于线性代数中的转置。
有没有一种方法可以将一个 1 × n 的表 T1 转换成如下形式:
c_1|c_2|c_3|...|a_n
-------------------
1  |2  |3  |...|n

将以下内容转换成 n 行 2 列的表格

key|val
-------
c_1|1
b_2|2
c_3|3
.  |.
.  |.
a_n|n

我假设T1中的每个列c_i都不太可能被识别出。

我认为该命令是PIVOT,详见以下链接:https://dev59.com/mmnWa4cB1Zd3GeqPxB7F?rq=1 - bobbyzhivago
4
@bobbyzhivago,我认为他需要的是UNPIVOT操作,在Sybase中不存在。 - swasheck
2个回答

5

基本上,你需要使用 UNION ALL 来执行 UNPIVOT 操作:

select 'c_1' col, c_1 value
from yourtable
union all
select 'c_2' col, c_2 value
from yourtable
union all
select 'c_3' col, c_3 value
from yourtable

你可以使用以下语句从 Sybase 中获取列的列表:select c.name from syscolumns c join sysobject o on c.id = o.id where o.name = 'yourtable',然后使用一些动态 SQL 生成 @bluefeet 提供的优秀解决方案。 - swasheck

0

@swasheck 那我猜他们得把列名读入列表中

mylistobject = SELECT sql FROM sqlite_master WHERE tbl_name = 'table_name' AND type = 'table'

创建一个新表,其中列名是主键,然后是值,然后在列表上进行迭代,使用Python编写的代码要比这个简洁得多。

for columnName in list:

   row = cursor.execute('SELECT ' + str(value) + 'FROM tableToBeTransposed WHERE COLUMN = ' + str(c_i) + ';').fetchone()

   cursor.execute('INSERT INTO newTable(c_i, values), (?,?)' (columnName, value))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接