2013-04-21 59 views
0

我有一個tableB,它有35列和數百千行(每行也是唯一的)。sql - 根據查詢表中的列名插入目標表中的列

+------------------------------------------------------------------------------+ 
|Date | ID | Name | Blah1 | Blah2 | ... | Hour1 | Hour2 | Hour3 | ... | Hour24 | 
+------------------------------------------------------------------------------+ 

TableB中的每一行都有小時觀察和其他一些管理信息。

我想基於查詢TableB插入到另一個表(TableA)中,使TableA(Hour)的列爲Hour1列賦值1,爲Hour2列賦值爲2,爲Hour3列賦值爲3,以及AND ObservationValue列將在Hour1,Hour2,Hour3 ...中指定爲Hour24的值。所以TableA以時間序列表示。

表A看起來像這樣:

+------------------------------------------------+ 
|Date| ID| Name | Zone | Hour | ObservationValue | 
+------------------------------------------------+ 

我不知道在所有我能做到這一點。我知道如何根據查詢插入到表中,但不知道如何執行我想要執行的操作。

欣賞幫助。

編輯

的樣本數據(我不知道,如果表B的設計是最好的,但這樣做是很多年來,我繼承了系統之前)。

表B:

8/1/2006 12:00:00 AM 48590 Miami Florida Blah Blah Blah Blah 69.89 63.55 50.73 45.05 44.17 50.39 63.93 84.73 87.61 102.43 123.39 154.33 181.1 232.71 262.11 290.64 299.44 262.67 214.22 191.15 172.49 132.62 105.83 98.25 

上面是一個記錄的一個例子。在這種情況下,ID = 48590,名稱=邁阿密,區=佛羅里達州。每年的每一天都有一個10年的條目。該表中大約有10,000個ID。

表A:

8/1/2006 12:00:00 AM 48590 Miami Florida 1 69.89 
8/1/2006 12:00:00 AM 48590 Miami Florida 2 63.55 
8/1/2006 12:00:00 AM 48590 Miami Florida 3 50.73 
8/1/2006 12:00:00 AM 48590 Miami Florida 4 45.05 
8/1/2006 12:00:00 AM 48590 Miami Florida 5 44.17 
8/1/2006 12:00:00 AM 48590 Miami Florida 6 50.39 
8/1/2006 12:00:00 AM 48590 Miami Florida 7 63.93 
8/1/2006 12:00:00 AM 48590 Miami Florida 8 84.73 
8/1/2006 12:00:00 AM 48590 Miami Florida 9 87.61 
8/1/2006 12:00:00 AM 48590 Miami Florida 10 102.43 
8/1/2006 12:00:00 AM 48590 Miami Florida 11 123.39 
8/1/2006 12:00:00 AM 48590 Miami Florida 12 154.33 
8/1/2006 12:00:00 AM 48590 Miami Florida 13 181.1 
8/1/2006 12:00:00 AM 48590 Miami Florida 14 232.71 
8/1/2006 12:00:00 AM 48590 Miami Florida 15 262.11 
8/1/2006 12:00:00 AM 48590 Miami Florida 16 290.64 
8/1/2006 12:00:00 AM 48590 Miami Florida 17 299.44 
8/1/2006 12:00:00 AM 48590 Miami Florida 18 262.67 
8/1/2006 12:00:00 AM 48590 Miami Florida 19 214.22 
8/1/2006 12:00:00 AM 48590 Miami Florida 20 191.15 
8/1/2006 12:00:00 AM 48590 Miami Florida 21 172.49 
8/1/2006 12:00:00 AM 48590 Miami Florida 22 132.62 
8/1/2006 12:00:00 AM 48590 Miami Florida 23 105.83 
8/1/2006 12:00:00 AM 48590 Miami Florida 24 98.25 

另一個問題我有是,什麼結構比較好,如果我打算做算術運算,例如從ObservationValue減去對於給定ID的ObservationValue爲同一ID,但在另一表? TableA最適合這種類型的操作,還是最好有T​​ableB結構?

+1

請爲'TableB'提供樣本數據以及應該如何insert'後'查看一下'TableA'。 – 2013-04-21 02:26:58

+0

請通過添加適當的標籤(Oracle,SQL Server,MySQL等)來指定您要定位的RDBMS。可能會有利用不被普遍支持的語言或產品功能的答案。此外,通過使用特定的RDBMS標記它,您的問題可能會得到更適合回答的人的關注。 – Taryn 2013-04-21 02:34:58

+0

這是SQL Sever(我認爲是2005)。我將它添加到標籤。 – codingknob 2013-04-21 02:46:59

回答

1

這聽起來像你想UNPIVOT TableB中的數據插入到TableA中。這將需要的列值TableB中,並將其轉換爲行:

-- insert into tableA (Date, Id, Name, Zone, hour, observationvalue) 
select Date, 
    Id, 
    Name, 
    Zone, 
    replace(hour, 'hour', '') hour, 
    observationvalue 
from tableB 
unpivot 
(
    observationvalue 
    for hour in (Hour1, Hour2, Hour3, Hour4, Hour5...) 
) unpiv; 

SQL Fiddle with Demo

+0

謝謝Bluefeet。我會嘗試一下。我還想知道,如果我打算進行算術運算,比如從ObservationValue中爲相同的ID減去ObservationValue中的ObservationValue,但在另一個表中減去ObservationValue,那麼哪種結構更好?例如,我想計算ObservationValue的預測值(發生在前一天,並在另一個表中)與實際ObservationValue之間的差異。 TableA是該類型操作的最佳選擇還是具有TableB結構更好? – codingknob 2013-04-21 18:17:03

+0

@ algotr8der你的'tableB'是非規格化的,應該修改爲使用類似'tableA'的東西,然後你可以使用可用於比較的格式的數據。 – Taryn 2013-04-21 21:28:17

+0

好,太好了。謝謝。我感謝您的幫助。我會放棄它。 – codingknob 2013-04-21 23:54:07