🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

Q&A

解決済

2回答

1948閲覧

同一ID、同一日付の複数行を1行にまとめたうえで、他の列のセル値を結合したい

mochiwo

総合スコア8

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

0グッド

0クリップ

投稿2021/01/03 06:54

編集2021/01/10 05:13

ご質問です。
データベースはOracleで、バージョンは11g R2です。

あるIDの人(ID列) がイベントAとイベントB(event列)を経験した場合、複数行に分かれて格納されているデータがございます。このイベントAとイベントBの2行が、同一日(event_date列)である場合に、2行をまとめてしまってevent列を「A+B」という文字列に変換したいと考えております。

たとえば、以下のBeforeの1行目と2行目はどちらもID=100, event_date = 20140401で同一ID、同一日付となっています。
この2行のeventをAfterの1行目のように「A+B」にして、Viewを作成したいと考えております。
event_dateに同一日付の時刻違いのデータはございません。

解決できるSQLクエリをご教示いただければ大変幸いです。
どうぞよろしくお願い申し上げます。

Before:
イメージ説明

After:
イメージ説明

なお、Beforeのサンプルデータを作成したクエリは以下でございます。

sql

1--Before 2CREATE TABLE Tbl 3 (ID int, event varchar2(1), event_date int) 4; 5 6INSERT ALL 7 INTO Tbl (ID, event, event_date) 8 VALUES (100, 'A', 20140401) 9 INTO Tbl (ID, event, event_date) 10 VALUES (100, 'B', 20140401) 11 INTO Tbl (ID, event, event_date) 12 VALUES (100, 'C', 20140408) 13 INTO Tbl (ID, event, event_date) 14 VALUES (200, 'A', 20140901) 15 INTO Tbl (ID, event, event_date) 16 VALUES (200, 'C', 20150401) 17 INTO Tbl (ID, event, event_date) 18 VALUES (300, 'A', 20160401) 19 INTO Tbl (ID, event, event_date) 20 VALUES (300, 'B', 20160401) 21 INTO Tbl (ID, event, event_date) 22 VALUES (300, 'D', 20160401) 23 INTO Tbl (ID, event, event_date) 24 VALUES (300, 'C', 20170501) 25SELECT * FROM dual 26;

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

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

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

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

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

YT0014

2021/01/03 14:35

データベースはOracleで良いのでしょうか?どのデータベースにしろ、バージョンも含めて明記してください。 また、整形とは、何を意味しているのでしょうか? SQLにて、Afterの出力のViewを作成したいということでしょうか? それとも、該当のテーブルのデータを書き換えて、Afterの状態にしたい、ということでしょうか? また、dateは、同一日付の時刻違いのデータはありえるのでしょうか? 質問を編集して、希望する動作仕様を、できるだけ網羅して、明確にご提示ください。
mochiwo

2021/01/03 15:21

@ YT0014様 ご連絡いただき誠にありがとうございます。 色々と質問に不備があり申し訳ございません。 データベースはOracleで、バージョンは11g R2です。 Afterの出力のViewを作成したいという意味でございます。 dateは、同一日付の時刻違いのデータはございません。 以上、わかりづらく大変申し訳ございませんでした。 どうぞご指導いただければ幸に存じます。
Orlofsky

2021/01/08 08:25

ダブルクォーティングすれば列名に予約語を使うことは可能ですが、常識のない奴だと嫌われますから、予約語を列名やテーブル名などに使うことは止めましょう。何のDATE型データか理解できるネーミングにしてください。同じ理由で、無意味にダブルクォーティングするのも止めてください。 https://docs.oracle.com/cd/E16338_01/server.112/b56299/ap_keywd001.htm#BABCJAEB
mochiwo

2021/01/09 08:02

@ Orlofsky様 ご指摘ありがとうございます。 列名に予約語を使用すべきでない旨、承知いたしました。 予約後の一覧も教えていただき誠にありがとうございます。 参考にさせていただきます。
Orlofsky

2021/01/09 10:31

この書き込みを見つけた後続者が理解し易いように質問を修正しては?
mochiwo

2021/01/10 04:44

@ Orlofsky様 ありがとうございます。 自分なりに修正させていただきました。 どうぞよろしくお願い申し上げます。
Orlofsky

2021/01/10 04:49

Oracle では ` でクォーティングするとエラーになったのでは?
mochiwo

2021/01/10 05:17

@ Orlofsky様 ご指摘ありがとうございます。 サンプルデータ作成時に、クオーテーションを無駄につけておりましたので、削除いたしました。
guest

回答2

0

ベストアンサー

LISTAGG()を使って、該当行の列の文字列結合を作成してください。

複数行をまとめて1行に集約

投稿2021/01/06 11:04

YT0014

総合スコア1748

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

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

mochiwo

2021/01/07 13:08

@YT0014様 誠にありがとうございます。 早速試してみます。
mochiwo

2021/01/10 05:13

@YT0014様 ありがとうございます! 無事実行することができました。
guest

0

@YT0014様の回答を参考にさせていただきました。

sql

1SELECT ID 2 , event_date 3 , LISTAGG(event, '+') WITHIN GROUP(ORDER BY event) event_name_composite 4FROM Tbl 5GROUP BY ID, event_date 6;

上記のクエリで、After画像のようなViewを作成することができました。
@YT0014様、@ Orlofsky様、色々とご指導いただき大変勉強になりました。
誠にありがとうございました。

投稿2021/01/10 05:15

mochiwo

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問