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

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

2回答

327閲覧

[SQL]レコードごとに集計対象を変える方法

ryo_is

総合スコア11

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/05/20 08:03

編集2019/05/20 08:24

##### 実現したいこと

下記、『取引テーブル』の"取引回数"と"取引相手"を更新したいです。

★取引テーブル

基準日取引No取引回数取引相手
2019052000004
2019051900003
2019051800002
2019051700001

『取引テーブル』は"基準日"と"取引No"で「取引明細テーブル」と関係性を持っており、
『取引テーブル』の1取引につき『取引明細テーブル』に2明細存在し、そこから"役割"と"ユーザID"がわかります。

★取引明細テーブル

基準日取引No役割ユーザID
2019052000004出品者U001
2019052000004取引者U004
2019051900003出品者U002
2019051900003取引者U003
2019051800002出品者U001
2019051800002取引者U003
2019051700001出品者U001
2019051700001取引者U002

例として「取引テーブル」の20190520のレコードの"取引回数"と"取引相手"の算出方法を以下にまとめます。


  1. "基準日"と"取引No"で明細テーブルと紐付け、役割が「出品者」の「ユーザID(=U001)」を取得
  2. 1で取得したユーザID:U001で『取引明細テーブル』を再抽出
  3. 2で取得した「基準日」と「取引No」で『取引明細テーブル』を再抽出

  →【基準日:20190520と取引No:00004】および、【基準日:20190518と取引No:00002】、【基準日:20190517と取引No:00001】のレコードが取得
0. 3で取得した結果に対し、役割が「取引者」のレコードのみに絞る。
0. レコード数が3なので"取引回数"が'3'、ユーザIDがU002とU003、U004の3種なので"取引相手"は'3'


ただし、集計対象は過去の取引のみという制約があります。
例えば、基準日:20190518の場合、『取引明細テーブル』より出品者はU001となるので、
基準日が20190520、20190518、20190517のレコードが該当しますが、
20190518より未来の20190520は集計対象から外す必要があります。

↓↓
★最終的に実現したい結果

基準日取引No取引回数取引相手
201905200000433
201905190000321
201905180000222
201905170000111

以下のSQLにて、上記算出方法の'4'まではできるかと思うのですが、そのあとがわからず…。
実現可能であるか、わかるかたご教示いただければ幸いです。
よろしくお願い致します。

SELECT t5.基準日, t5.取引No FROM 取引明細 AS t5 INNER JOIN (SELECT t3.基準日, t3.取引No FROM 取引明細 AS t3 WHERE t3.ユーザID = ( SELECT t1.ユーザID FROM 取引明細 AS t1 INNER JOIN 取引 AS t2 ON t1.基準日 = t2.基準日 AND t1.取引No = t2.取引No GROUP BY t1.ユーザID ) ) AS t4 ON t4.基準日 = t5.基準日 AND t4.取引No = t5.取引No WHERE t5.役割 = '取引者'

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

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

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

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

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

yambejp

2019/05/20 08:19

1.「ユーザID(=U001)」を取得→20190520を指定したらその日の出品者を取得するのはわかる 2. ユーザID=U001から【基準日:20190520と取引No:00004】と【基準日:20190518と取引No:00002】が選ばれるロジックがわからない 基準日=20190517.出品者=U001はなぜ選ばれないのでしょうか?
ryo_is

2019/05/21 00:18 編集

>yambejpさん 大変失礼いたしました。 ご指摘いただいた通り「基準日=20190517.出品者=U001」も含まれるため、その通りに修正いたしました。
guest

回答2

0

DB2を試せる環境は無いので、保証などはできませんが。
相関副問合せ版

SQL

1select 基準日, 取引NO 2 ,(select count(*) from 取引明細 3 where 基準日<=t1.基準日 4 and 役割='取引者' 5 and ユーザーID=t1.ユーザーID 6 ) 取引回数 7 ,(select count(distinct ユーザーID) from 取引明細 8 where 基準日<=t1.基準日 9 and 役割='出品者' 10 and 取引NO in ( 11 select 取引NO from 取引明細 12 where 基準日<=t1.基準日 and ユーザーID=t1.ユーザーID 13 ) 14 ) 取引相手 15from 取引明細 t1 16WHERE 役割 = '取引者'

インラインビュー版

SQL

1select t3.基準日, t3.取引NO 2 , count(distinct t3.ユーザーID) as 取引回数 3 , count(distinct t4.ユーザーID) as 取引相手 4from ( 5 select t1.*, t2.取引NO as ユーザー別取引NO 6 from 取引明細 t1 7 inner join 取引明細 t2 8 on t1.基準日>=t2.基準日 9 and t1.ユーザーID=t2.ユーザーID 10 and t1.役割=t2.役割 11 WHERE t1.役割='取引者' 12 ) t3 13 left join 取引明細 t4 14 on t3.基準日>=t4.基準日 15 and t3.ユーザー別取引NO=t4.取引NO 16 and t4.役割='出品者' 17group by t3.基準日, t3.取引NO

投稿2019/05/21 02:25

編集2019/05/21 03:17
sazi

総合スコア25173

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

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

0

回答にはなってないかもしれませんが

select a.* from (select 1) as a;

というSQLを打てます。
4の工程で出ている結果に対してcountを打てれば結果を出せるという状況なら

select count(a.取引no) from ( SELECT t5.基準日, t5.取引No FROM 取引明細 AS t5 INNER JOIN (SELECT t3.基準日, t3.取引No FROM 取引明細 AS t3 WHERE t3.ユーザID = ( SELECT t1.ユーザID FROM 取引明細 AS t1 INNER JOIN 取引 AS t2 ON t1.基準日 = t2.基準日 AND t1.取引No = t2.取引No GROUP BY t1.ユーザID ) ) AS t4 ON t4.基準日 = t5.基準日 AND t4.取引No = t5.取引No WHERE t5.役割 = '取引者' ) as a

投稿2019/05/20 08:10

hentaiman

総合スコア6415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問