6

私は現在このように見えるテーブルを持っています-

CASEID  ¦  FORMNAME  ¦  NAME  ¦  VALUE

601554  ¦  CASEFORM  ¦  Mond  ¦  AAAA
601554  ¦  CASEFORM  ¦  Tues  ¦  BBBB
601554  ¦  CASEFORM  ¦  Wedn  ¦  CCCC
601554  ¦  CASEFORM  ¦  Thur  ¦  DDDD

次のように、データをコピーしてその形式を完全に変更する新しいテーブルを SQL で作成したいと考えています。

CASEID  ¦  FORMNAME  ¦  Mond  ¦  Tues  ¦  Wedn  ¦  Thur

601554  ¦  CASEFORM  ¦  AAAA  ¦  BBBB  ¦  CCCC  ¦  DDDD

元のテーブルには約 400 行あるため、新しいテーブルには 400 列が必要になります。

私の SQL の知識は確かに限られていますが、解決策が必要な場合はいつでも失敗する可能性があります。ただし、この場合、どこから始めればよいかさえわかりません。誰かが私を正しい方向に向けることができますか?

4

5 に答える 5

1

SQL Serverの場合、ピボット機能を確認することをお勧めします。これがあなたのシナリオに一致し、あなたが望む結果を出力するサンプルです...

declare @data table (CASEID int, FORMNAME varchar(20), NAME varchar(20), VALUE varchar(20))
insert into @data values
(601554, 'CASEFORM', 'Mond', 'AAA'),
(601554, 'CASEFORM', 'Tues', 'BBB'),
(601554, 'CASEFORM', 'Wedn', 'CCC'),
(601554, 'CASEFORM', 'Thur', 'DDD')

SELECT *
FROM @data
PIVOT
(
  MAX(VALUE)
  FOR [NAME] IN ([Mond],[Tues],[Wedn],[Thur])
)
AS data
于 2012-05-17T13:57:45.507 に答える
1

メタモデルを定義しています。

あなたがする必要があるのは、METAMODELテーブルをループし、MODEL列の定義に対応する行ごとにカスタムALTERステートメントを作成することです。

また、値を変換したいこともわかります。その場合は、同じループ内でDMLステートメントもその場でビルドし、後で実行して、宛先モデルのビルドが完了します。

リンク:

テーブルmysqlの変更:http://dev.mysql.com/doc/refman/5.0/en/alter-table.html

カーソルmysql:http ://dev.mysql.com/doc/refman/5.0/en/cursors.html


一方、このクエリ:

SELECT CONCAT('ALTER TABLE mytable ADD COLUMN ', t.name, ' VARCHAR(256);') FROM mytable t

これらの列を手動で追加するために必要なaltertableステートメントが返されます。これをモデルとして使用して、後でテーブルに値を追加する次のクエリを作成できます。

Rgds。

于 2012-05-17T13:42:32.417 に答える
1

次のクエリから始めます。

create table NewTable(CASEID int,  FORMNAME varchar(255))
go

insert into NewTable select distinct caseid,formname from OldTable
go

select  distinct 'alter table NewTable add ' +[name]+ ' varchar(255)'  from oldtable

結果をコピーして実行します。

次に、次のクエリを実行します。

select distinct 'update NewTable set ' +Name+ ' = ''' + Value +''' where caseid = ' +cast(caseid as varchar(20))+
' and FORMNAME = '''+Formname+''''
from oldtable

結果をコピーして実行します。

編集:自動化されたバージョンを追加しました:

create table NewTable(CASEID int,  FORMNAME varchar(255)) 
go 
insert into NewTable select distinct caseid,formname from OldTable 
go
DECLARE @query VARCHAR(max)
set @query = ''
select  @query = @query + 'alter table NewTable add ' +[name]+ ' varchar(255);'  from (select distinct name from oldtable )c
exec (@query)
set @query = ''
select @query = @query+ 'update NewTable set ' +Name+ ' = ''' + Value +''' where caseid = ' +cast(caseid as varchar(20))+ ' and FORMNAME = '''+Formname+'''' 
from  (select distinct  Name, Value, Caseid, FormName from OldTable)c
exec (@query)
于 2012-05-17T14:06:01.463 に答える
1

列の正確な数がわからない場合は、これを使用できます。

DECLARE @columns varchar(max)
DECLARE @query VARCHAR(max)
SELECT @columns = COALESCE(@columns + ',[' + cast([Name] as varchar(100)) + ']', 
                 '[' + cast([Name] as varchar(100))+ ']')           
    FROM   @data1 

SET @query = 'SELECT * FROM @data1 '
SET @query = @query  + '            
            PIVOT
            (
                MAX(VALUE) FOR [NAME] IN (' + @columns + ')
            )
             AS p'                                  

EXEC @query
于 2012-05-17T14:08:16.213 に答える
0

私見、それは本当に奇妙な要件です! そうは言っても、必要なのはピボットクエリです。詳細は、 Ask Tom - Pivot Queryで確認できます。

于 2012-05-17T14:03:46.157 に答える