2012-05-17 28 views
6

我目前看起来有点像这个 -SQL - 如何创建一个值为列和新格式的表格?

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知识肯定是有限的,但是当我需要一个解决方案时,我总是可能会大失所望。但在这种情况下,我甚至不知道从哪里开始。有人能指引我朝着正确的方向吗?

+2

的SQL Server,MySQL和甲骨文? – MatBailie

+0

SQL Server 2008 –

+0

只是想感谢迄今发布的所有人。我正在阅读你的所有建议。干杯。 –

回答

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) 
+0

这实际上完成了这项工作,但是这两个手动元素给我带来了一个问题,因为我需要将整个过程自动化为自动触发。你知道这样做的好方法吗?我正在使用eForms和Web服务,并希望在提交eForm时通过Web服务/存储过程触发此过程。 –

+0

@CraigC那怎么样? – Kevin

+0

非常感谢Kevin,感谢其他人。我首先研究这个选项,因为它对于我的SQL知识水平来说似乎是最简单的。令人高兴的是,它完美地满足了我所需要的,现在可以让我对组织的eform数据报告产生巨大影响。 –

1

您正在定义元模型。

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

我也看到你也想改变的价值观。如果是这样,那么在同一个循环中即时构建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 

将返回ŧ他改变你需要手动添加这些列的表格语句。您可以将其用作模型来构建下一个查询,以便稍后将值添加到表中。

Rgds。

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 
+0

我在这个查询中看到的唯一问题是他必须键入400列名称 – Kevin

+0

为什么要输入它们?我会利用Visual Studios的正则表达式搜索和替换功能。我会提供一个答案更新... –

+0

@rs打我也是 –

0

恕我直言,这是一个非常奇怪的要求!据说,你需要的是一个数据透视查询。详情可Ask Tom - Pivot Query

+0

这是一个奇怪的。我试图从一个非常奇怪的系统中真正奇怪的表中去除数据,并试图将其转换为可用的格式以放入Business Objects Universe中。 –

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 
相关问题