创建另一个MySQL的一个表列的行名

时间:2012-10-12 22:37:48

标签: mysql row

我不知道这是否可行。 我有以下字段Table1

No

A
B
C
D

我希望table2's列名称是table1的行名称(每个varchar(20),全为空

A B C D

如果我在table1中添加一行,那么table2列也应该被追加。

任何建议。

3 个答案:

答案 0 :(得分:1)

这里有关于T-SQL(SQL Server)中的一些伪解决方案的一些信息,其中一些可以转移到MySQL:http://sqlserveradvisor.blogspot.co.uk/2009/03/sql-server-convert-rows-to-columns.html 然而,没有简单的方法。

我能想出的最好的东西(再次在T-SQL中)就是这种动态SQL解决方案:

    declare @tempTable table (ColumnName nvarchar(10))
    declare @sql nvarchar(max) 
    insert @tempTable
    select 'Col1'
    union select 'Col2'
    union select 'Col3'
    select @sql = isnull(@sql+ ',','') + '1 ' + quotename(ColumnName)
    from @tempTable
    set @sql = 'select ' + @sql
    exec(@sql)

- 编辑 -

我设法在MySQL上试用了一个脚本(通过在线主持人:http://headfirstlabs.com/sql_hands_on/hf01.htm)。下面的代码与那里的演示数据库一起使用,所以应该在你的桌子上工作。我把列包含列号的数据略微过于复杂,因为我有点困惑,但希望它有用,所以我现在就把它留下了。

set @test:='select';
set @i:=1;
select @test:=concat(@test, ' ',case when @i>1 then ',' else '' end, ' ''Col', @i, ''' as ', last_name) , @i:=@i+1 from my_contacts;
select @test;
PREPARE stmt1 FROM @test;
execute stmt1;

(简化的MySQL版本)

set @sql:='select';
select @sql:=concat(@sql, case when @sql>'select' then ', ' else ' ' end, '0 as ', last_name) from my_contacts;
select @sql;
PREPARE stmt1 FROM @sql;
execute stmt1;

希望有所帮助。

答案 1 :(得分:1)

目前尚不清楚你要做什么。但是,如果您只希望这些行中的数据成为SELECT中的行,那么您可以执行以下操作:

select 
  max(case when no = 'A' then col end) as A,
  max(case when no = 'B' then col end) as B,
  max(case when no = 'C' then col end) as C,
  max(case when no = 'D' then col end) as D
from table1

请参阅SQL Fiddle With Demo

如果您想以相反的方式将列转换为行,那么您可以使用UNION ALL

select col1 No
from table1
union all
select col2 No
from table1
union all
select col3 No
from table1
union all
select col4 No
from table1

请参阅SQL Fiddle With Demo

答案 2 :(得分:0)

仅使用查询是不可能的,您需要使用服务器端语言来实现此目的。