我不知道这是否可行。
我有以下字段Table1
。
No
A
B
C
D
我希望table2's
列名称是table1的行名称(每个varchar(20),全为空
A B C D
如果我在table1中添加一行,那么table2列也应该被追加。
任何建议。
答案 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
如果您想以相反的方式将列转换为行,那么您可以使用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
答案 2 :(得分:0)
仅使用查询是不可能的,您需要使用服务器端语言来实现此目的。