2013-03-05 122 views
1

当前的表格未针对增长进行设置,我想将现有数据迁移到更适合扩展的表格。让我来解释:如何将一张表中的记录插入第二张表

当前表设置,如:

+--------+---------------+----+----+----+------+-----------+ 
|  id | DateOfService | AM | MD | PM | RATE | CLIENT_ID | 
+--------+---------------+----+----+----+------+-----------+ 
|  1 | 3/4/2013  | 1 | 0 | 0 | 10 |  123 | 
|  2 | 3/5/2013  | 1 | 0 | 0 | 10 |  123 | 
|  3 | 3/6/2013  | 1 | 0 | 0 | 10 |  123 | 
|  4 | 3/5/2013  | 0 | 1 | 1 | 50 |  147 | 
|  5 | 3/6/2013  | 1 | 1 | 1 | 25 |  189 | 
+--------+---------------+----+----+----+------+-----------+ 

,而是,我想设置我的表像:

+----------+---------------+---------------+-----------+ 
|  pkid | DateOfService | ServiceTypeID | CLIENT_ID | 
+----------+---------------+---------------+-----------+ 
|  1 | 3/4/2013  |    1 |  123 | 
|  2 | 3/5/2013  |    1 |  123 | 
|  3 | 3/6/2013  |    1 |  123 | 
|  4 | 3/5/2013  |    2 |  147 | 
|  5 | 3/5/2013  |    3 |  147 | 
|  6 | 3/6/2013  |    1 |  189 | 
|  7 | 3/6/2013  |    2 |  189 | 
|  8 | 3/6/2013  |    3 |  189 | 
+----------+---------------+---------------+-----------+ 

的ServiceTypeID表将是一个options表设置的东西像:

+-------------------+---------+ 
|  ServiceTypeID | Service | 
+-------------------+---------+ 
|     1 | AM  | 
|     2 | MD  | 
|     3 | PM  | 
+-------------------+---------+ 

我需要帮助提出一个查询我可以运行,将seleclec t并遍历现有数据并填充我的新表。

+0

我不明白pkid来自何处 – Hogan 2013-03-05 03:04:51

+0

@hogan您的误解是有道理的。我没有正确输入数值。感谢您的支持。我更新了示例pkid值。 – HPWD 2013-03-05 04:13:26

回答

0

因为你的选择表 “设置”,像这样的工作:

INSERT INTO newtable 
    SELECT id, dateofservice, 1, clientid 
    FROM oldTable 
    WHERE AM = 1 
    UNION ALL 
    SELECT id, dateofservice, 2, clientid 
    FROM oldTable 
    WHERE MD = 1 
    UNION ALL 
    SELECT id, dateofservice, 3, clientid 
    FROM oldTable 
    WHERE PM = 1 

NB,我m使相同的假设蓝色是,你的示例表是错误的,pk应该有值1,2,3,4,4,5,5,5

如果你想要该键是唯一的,那么j ust将其定义为自动递增键,并且不要将其包含在此选择中。

+0

谢谢Hogan,你在这里提出的想法正是我所期待的。 – HPWD 2013-03-05 04:50:12

1

您可以使用UNPIVOT函数将当前表格从列变为行。然后,您可以加入您的options表格并将数据插入到您的新表格中。

UNPIVOT代码将是:

select id, 
    dateofservice, 
    client_id, 
    col, 
    value 
from yourtable 
unpivot 
(
    value 
    for col in (AM, MD, PM) 
) unpiv 
where value <> 0 

SQL Fiddle with Demo

然后,你将加入到你的options表得到的结果。您可以使用此查询INSERT INTO新表:

-- INSERT INTO yourNewTable 
select src.id as pkid, 
    src.dateofservice, 
    o.servicetypeid, 
    src.client_id 
from 
(
    select id, 
    dateofservice, 
    client_id, 
    col, 
    value 
    from yourtable 
    unpivot 
    (
    value 
    for col in (AM, MD, PM) 
) unpiv 
    where value <> 0 
) src 
inner join options o 
    on src.col = o.service 

SQL Fiddle with Demo

+0

这似乎是一个趋势,我把一个简单的解决方案,接近答案,你把一个确切的复杂。接下来,随着时间的流逝,每个人都告诉我我的错误:)祝你有个美好的夜晚。 – Hogan 2013-03-05 03:14:29

+1

@Hogan我没有看到你的解决方案有什么问题。我只是喜欢用'pivot'和'unpivot'来解决问题(你会在我的个人资料中看到)。我还使用了一个连接让代码获得'servicetypeid'而不是对它们进行硬编码以防止胖手指输入错误。 ':'' – Taryn 2013-03-05 03:16:38

+0

@bluefeet我喜欢你提供的例子,但是我可能太绿了,无法使用pivot和unpivot(以前从未听说过unpivot)。但是SQL小提琴非常棒!我一定会尝试一下。 – HPWD 2013-03-05 04:20:21

相关问题