1

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

No

A
B
C
D

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

A B C D

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

有什么建议么。

4

3 回答 3

1

目前尚不清楚您要做什么。但是,如果您只希望这些行中的数据成为 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

请参阅带有演示的 SQL Fiddle

如果您想采用相反的方式并将列转换为行,那么您可以使用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

于 2012-10-12T23:22:34.200 回答
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;

希望有帮助。

于 2012-10-12T23:04:15.603 回答
0

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

于 2012-10-12T22:40:09.013 回答