SQL - 如何创建一个包含值为列和新格式的表?

时间:2012-05-17 13:40:32

标签: sql sql-server-2008

我有一张目前看起来有点像这样的表 -

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知识肯定是有限的,但是当我需要解决方案时,我总是会犯错误。在这种情况下,我甚至不知道从哪里开始。有人能指出我正确的方向吗?

5 个答案:

答案 0 :(得分:1)

您正在定义元模型。

你需要做的是循环你的METAMODEL表并为找到的每一行建立一个自定义的ALTER语句,对应于你对MODEL列的定义。

我也看到你也希望改变价值观。如果是这样的话,也可以在同一个循环中动态构建DML语句,然后执行它们,这样就可以完成构建目标模型。

<强>链接:

alter table 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。

答案 1 :(得分: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

答案 2 :(得分: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)

答案 3 :(得分: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

答案 4 :(得分:0)

恕我直言,这是一个非常奇怪的要求! 话虽如此,您需要的是一个数据透视查询。详情请见Ask Tom - Pivot Query