これが可能かどうかはわかりません。私はTable1
次のフィールドを持っています。
No
A
B
C
D
列名をtable1の行名にしますtable2's
(それぞれvarchar(20)、すべてnull)
A B C D
table1に行を追加すると、table2列も追加されるはずです。
助言がありますか。
ここに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;
お役に立てば幸いです。
あなたが何をしようとしているのかは明確ではありません。ただし、これらの行のデータのみをの行にしたい場合は、次の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 FiddleWithDemoを参照してください
反対の方法で列を行に変換する場合は、:を使用します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 FiddleWithDemoを参照してください
これはクエリだけでは不可能です。これを実現するには、サーバー側の言語で作業する必要があります。