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

既存のデータを選択してループし、新しいテーブルにデータを入力する、実行可能なクエリを考え出すのに助けが必要です。

4

2 に答える 2

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 FiddlewithDemoを参照してください

次に、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 FiddlewithDemoを参照してください

于 2013-03-05T02:56:47.537 に答える
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、私は同じ仮定を青にしています、あなたの例のテーブルは間違っていて、pkは値1、2、3、4、4、5、5、5を持っているはずです

そのキーを一意にしたい場合は、それを自動インクリメントキーとして定義し、この選択に含めないでください。

于 2013-03-05T03:08:26.453 に答える