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

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

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

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

DB2

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

受付中

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

ryo_is
ryo_is

総合スコア0

SQL

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

DB2

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

2回答

0評価

0クリップ

5閲覧

投稿2019/05/20 08:03

編集2022/01/12 10:55

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

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

★取引テーブル

基準日取引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】のレコードが取得
0. 3で取得した結果に対し、役割が「取引者」のレコードのみに絞る。
0. レコード数が2なので"取引回数"が'2'、ユーザIDがU003とU004の2種なので"取引相手"は'2'


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

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

基準日取引No取引回数取引相手
201905200000422
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.役割 = '取引者'

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

yambejp
yambejp

2019/05/20 08:19

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

2019/05/21 00:18 編集

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

SQL

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

DB2

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