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

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

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

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

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

Q&A

解決済

3回答

3207閲覧

SQLについて、何度も同じデータに結合をする無駄を省きたい。

ri-ons

総合スコア7

SQL

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

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/03/07 06:15

いつもお世話になります。
SQLについての質問をさせていただきます。
RDBMSはDB2ですが、他のSQLでの解決法でも参考にさせていただきたいです。

以下のデータがあるとします。

売上ヘッダー

売上ID金額
100***

売上明細

売上ID明細番号
1000
1001
1002

取付費データ

売上ID明細番号作業者コード作業者並び順取付金額
1000A1***
1001A1***
1002A1***
1001B2***
1002B2***
1000C3***

これらのデータから、売上ID:100にどの作業者が関わっていたのかを1行で表現したいので、
このようなデータを取得したいです。

売上ID作業者1作業者2作業者3
100ABC

今思いついているのが、
SELECT
DISTINCT H.売上ID, T1.作業者コード, T2.作業者コード, T3.作業者コード
FROM 売上ヘッダー AS H
LEFT JOIN 取付費データ AS T1 ON T1.売上ID = H.売上ID AND T1.作業者並び順 = 1
LEFT JOIN 取付費データ AS T2 ON T2.売上ID = H.売上ID AND T2.作業者並び順 = 2
LEFT JOIN 取付費データ AS T3 ON T3.売上ID = H.売上ID AND T3.作業者並び順 = 3

ですが、LEFT JOINを同じデータに何度も行っているところが明らかに無駄であり、おそらく他にいい手があるのだろうと感じています。

よい方法がありましたら、是非お知恵を拝借したいと思います。
お手数をおかけしますが、よろしくお願いします。

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

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

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

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

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

guest

回答3

0

LISTAGG を参考に。

投稿2019/03/07 06:28

Orlofsky

総合スコア16415

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

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

0

ベストアンサー

LISTAGGで集約したものを分解してカラム生成するという事になりますね。
DB2で文字列を分解するのをwith式を使用して試されている方が居られました。
MySQL 独自の SUBSTRING_INDEX関数を(あらためて)標準SQL で書いてみよう!!

下記の内容で取得後にAPで分解するか、リンク先の内容を組み込んでSQLのみで行うかでしょうか。
のが良さそうです。
※リンク先は区切り文字付の文字列を行に展開するもの(LISTAGGの逆版)なので、無視して下さい。

SQL

1SELECT 売上ID, LISTAGG(作業者コード, ',') WITHIN GROUP(ORDER BY 作業者並び順) as 作業者リスト 2FROM 売上ヘッダー 3GROUP BY 売上ID

投稿2019/03/07 06:59

編集2019/03/11 07:08
sazi

総合スコア25173

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

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

0

まぁSQLで可変データを横方向に表示してもなんの意味もないですから
普通はやらないですね

他のSQLでの解決法でも

あえてやるならMySQLだとこう

SQL

1 2create table tbl (売上ID int,明細番号 int,作業者コード varchar(10)); 3insert into tbl values 4(100,0,'A'), 5(100,1,'A'), 6(100,2,'A'), 7(100,1,'B'), 8(100,2,'B'), 9(100,0,'C'); 10 11 12select 売上ID,group_concat(distinct 作業者コード) as 作業者コード from tbl 13group by 売上ID; 14

投稿2019/03/07 06:25

yambejp

総合スコア114769

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問