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

您正在定义一个元模型。

您需要做的是循环您的 METAMODEL 表并为找到的每一行构建一个自定义 ALTER 语句,这些行与您对 MODEL 列的定义相对应。

我也看到你也想改变价值观。如果是这样,请在同一循环中动态构建 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

将返回手动添加这些列所需的 alter table 语句。您可以将其用作模型来构建下一个查询,以便稍后将值添加到您的表中。

Rgds。

于 2012-05-17T13:42:32.417 回答
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

从这个查询开始:

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 查询中找到

于 2012-05-17T14:03:46.157 回答