sql - 根据查询表中的列名插入目标表中的列

时间:2013-04-21 02:22:59

标签: sql sql-server sql-insert

我有一个包含35列和数十万行的tableB(每行也是唯一的)。

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

表B中的每一行都有每小时观察和其他一些管家信息。

我想基于查询表B,使得在表A时间(小时)的柱被分配值1列Hour1,2为列Hour2,3列Hour3等和插入到另一个表(表A)将ObservationValue列分配给Hour1,Hour2,Hour3 ...到Hour24的值。所以TableA是时间序列表示。

TableA看起来像这样:

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

我根本不确定如何做到这一点。我知道如何根据查询插入到表中,但不知道如何执行我想要执行的操作。

感谢帮助。

修改

示例数据(我不确定TableB的设计是否最好,但这是在我继承系统之前很多年才完成的)。

表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,Name = Miami,Zone = Florida。每年的每一天都有一个条目,为期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减去给定ID的ObservationValue但是在另一个表中,哪种结构更好? TableA对于那种类型的操作是最佳的还是具有TableB结构更好?

1 个答案:

答案 0 :(得分:1)

听起来你想要将Table中的数据UNPIVOT插入到TableA中。这将获取表中的列值并将其转换为行:

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