2012-05-17 27 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 
相關問題