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