我不知道这是否可能。我有Table1
以下字段。
No
A
B
C
D
我希望table2's
列名是 table1 的行名(varchar(20) 每个,都是空的)
A B C D
如果我在 table1 中添加一行,table2 列也应该被附加。
有什么建议么。
目前尚不清楚您要做什么。但是,如果您只希望这些行中的数据成为 a 中的行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
这里有一些关于 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;
希望有帮助。
仅使用查询是不可能的,您需要使用服务器端语言来实现这一点。