質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

1669閲覧

PostgreSQLで別テーブルに変換するInsert文

durasama

総合スコア18

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/02/26 02:40

編集2019/02/26 04:13

前提・実現したいこと

PostgreSQLでaテーブルにあるデータを変換してbテーブルにINSERTを行いたいです。

aテーブル

Create

1CREATE TABLE a 2( 3 ID INTEGER NOT NULL , 4 DATETIME TIMESTAMP NOT NULL , 5 NUM INTEGER 6) 7
id,datetime,num 10,2019-02-05 12:00:00,10 10,2019-02-06 12:00:00,5 10,2019-02-05 10:00:00,3 50,2019-02-07 03:00:00,30 50,2019-02-05 14:00:00,15

変換先bテーブル

Create

1CREATE TABLE b 2( 3 ID INTEGER NOT NULL , 4 DATE DATE NOT NULL , 5 NUM_00 INTEGER , 6 NUM_01 INTEGER , 7 NUM_02 INTEGER , 8 NUM_03 INTEGER , 9 NUM_04 INTEGER , 10 NUM_05 INTEGER , 11 NUM_06 INTEGER , 12 NUM_07 INTEGER , 13 NUM_08 INTEGER , 14 NUM_09 INTEGER , 15 NUM_10 INTEGER , 16 NUM_11 INTEGER , 17 NUM_12 INTEGER , 18 NUM_13 INTEGER , 19 NUM_14 INTEGER , 20 NUM_15 INTEGER , 21 NUM_16 INTEGER , 22 NUM_17 INTEGER , 23 NUM_18 INTEGER , 24 NUM_19 INTEGER , 25 NUM_20 INTEGER , 26 NUM_21 INTEGER , 27 NUM_22 INTEGER , 28 NUM_23 INTEGER 29)
id,date,num_00,num_01,num_02,num_03,num_04,num_05,num_06,num_07,num_08,num_09,num_10,num_11 ,num_12,num_13,num_14,num_15,num_16,num_17,num_18,num_19,num_20,num_21,num_22,num_23 10,2019-02-05,0,0,0,0,0,0,0,0,0,0,3,0,10,0,0,0,0,0,0,0,0,0,0,0 10,2019-02-06,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0 50,2019-02-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0 50,2019-02-07,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

このようにしてiddatetimeの日付が一致しているものを
一つのレコードにし、datetimeの時刻とnum
時間別のカラムに変換するSQLを作成しています。

INSERTする際に上記のように変換することは可能なのでしょうか。

どうか、ご教授頂けないでしょうか。

試したこと

INSERTを行ってから別SQLでUPDATEを行って一つずつ入れて行こうと作業していたら
一つのSQLでINSERTを行う際に変換するようにとの指示が出てそちらで対応しようとしています。

補足情報(FW/ツールのバージョンなど)

Windows10
Postgresql-11
pgAdmin 4 v3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/26 02:48

各テーブルのCREATE TABLE文、サンプルデータのINSERT文をご提示いただいた方が再現確認ができますし、的確な回答につながります。
m.ts10806

2019/02/26 02:50

datetimeのtime部分はどうするつもりなのでしょうか。
m.ts10806

2019/02/26 02:51

↑ごめんなさい読み違えました。bのnum_XXがそれぞれ時間になってるわけですね。
m.ts10806

2019/02/26 02:54

>変換するようにとの指示が出て これはどういう状況なのでしょうか。 あまり作業依頼、宿題代行のような内容だとそもそも質問になってませんので、そのあたりが誤解されないように、まず自身がやってみたこととか調べたことを記載して、何が問題か課題かを明確に記載されるよう強くすすめます。 今のところ丸投げですし。
sazi

2019/02/26 02:59

aテーブルの状況が変わったら、updateも必要だと思いますが、insertのみってことはdeleteしてinsertなんですか?
durasama

2019/02/26 03:02

>これはどういう状況なのでしょうか。 INSERT文とUPDATE文を分けて二つのSQLにすれば 変換の方法はわかるのですが INSERT文のみで変換を行いbテーブルに追加するという流れが 私の方では知識が足りなかったため質問させていただきました。 丸投げの様になってしまい申し訳ございません。
durasama

2019/02/26 03:04

>aテーブルの状況が変わったら、updateも必要だと思いますが、insertのみってことはdeleteしてinsertなんですか? 説明不足でした。 aテーブルの中身は変わらないので固定のaテーブルからbテーブルにinsertのみになります。
sazi

2019/02/26 03:27 編集

> aテーブルの中身は変わらないので固定のaテーブルからbテーブルにinsertのみになります。 変わらないものを、再度insertすると重複になるので、insertは一度きりのデータ移行みたいなものってことですか? 一度しか実行しないのならinsertのみでっていうハードルは何なのでしょうね
m.ts10806

2019/02/26 03:21

質問は編集できますので適宜加筆修正願います
durasama

2019/02/26 04:08

>insertは一度きりのデータ移行みたいなものってことですか? そうなります。
guest

回答3

0

ベストアンサー

insertはinsert into テーブル selectという構文が使えますので、selectで成形すれば可能です。
case で分岐させた列を作ります。

SQL

1insert into b 2select id, datetime ::date 3 , case when date_part('hour',datetime)=0 then num else 0 end -- num_00 4-- ~略~ 5 , case when date_part('hour',datetime)=23 then num else 0 end -- num_23 6from a 7order by id, datetime

投稿2019/02/26 04:32

編集2019/02/26 04:35
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

durasama

2019/02/26 05:05

sazi様 ありがとうございます。 上記SQLを実行することで望んでた処理が行えました。 SQLにはまだあまり慣れていなくて勉強になりました。 お忙しい中回答して頂いてありがとうございます。
guest

0

ヒントはSTRING_AGG

投稿2019/02/26 03:12

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/02/26 03:29

いや、それは。 STRING_AGGで纏めても時間帯ごとにどうやって分離します?
Orlofsky

2019/02/26 03:47

そうか、時間帯毎に分けるのね。 SQLだけじゃ無理だから、LOOPが使えるPL/pgSQLなどを使わないと実現できませんね。
sazi

2019/02/26 03:59

caseで分ければ大丈夫ですよ。
Orlofsky

2019/02/26 04:34

CASEを24回も書きたくないですね。
sazi

2019/02/26 04:39 編集

ほぼコピペで大丈夫です。 pl/pgsqlでif文の分岐は数変わらないし、ループする処理を書く方が面倒です。
guest

0

sazi様にご回答頂いた

SQL

1insert into b 2select id, datetime ::date 3 , case when date_part('hour',datetime)=0 then num else 0 end -- num_00 4-- ~略~ 5 , case when date_part('hour',datetime)=23 then num else 0 end -- num_23 6from a 7order by id, datetime

上記を24通り時間ごとに行うことで処理できました。
皆様、お忙しい中ありがとうございました。

投稿2019/02/26 05:06

durasama

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問