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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

1678閲覧

結合先のテーブルを、結合元のテーブルデータで絞り込みたい

backfever

総合スコア14

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

1グッド

0クリップ

投稿2019/05/29 04:59

編集2019/05/29 05:32

イメージ説明

CREATE TABLE [dbo].[結果テーブル]( [社員コード] [varchar](6) NOT NULL, [等級] [tinyint] NOT NULL, [実施月] [varchar](6) NOT NULL, CONSTRAINT [PK_結果テーブル] PRIMARY KEY CLUSTERED ( [社員コード] ASC, [実施月] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] ; CREATE TABLE [dbo].[加算テーブル]( [等級] [tinyint] NOT NULL, [適用月] [varchar](6) NOT NULL, [ポイント] [int] NOT NULL, CONSTRAINT [PK_加算テーブル] PRIMARY KEY CLUSTERED ( [等級] ASC, [適用月] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] ; INSERT INTO [dbo].[加算テーブル] VALUES (0,'202010',12); INSERT INTO [dbo].[加算テーブル] VALUES (0,'201905',10); INSERT INTO [dbo].[加算テーブル] VALUES (0,'201901',9); INSERT INTO [dbo].[加算テーブル] VALUES (1,'202010',10); INSERT INTO [dbo].[加算テーブル] VALUES (1,'201905',7); INSERT INTO [dbo].[加算テーブル] VALUES (1,'201901',6); INSERT INTO [dbo].[加算テーブル] VALUES (2,'201901',5); INSERT INTO [dbo].[加算テーブル] VALUES (2,'201812',4); INSERT INTO [dbo].[加算テーブル] VALUES (3,'201901',3); INSERT INTO [dbo].[加算テーブル] VALUES (3,'201812',1); INSERT INTO [dbo].[結果テーブル] VALUES ('000107',0,'201904'); INSERT INTO [dbo].[結果テーブル] VALUES ('000108',1,'201905'); INSERT INTO [dbo].[結果テーブル] VALUES ('000109',2,'201905'); INSERT INTO [dbo].[結果テーブル] VALUES ('000110',3,'201905'); INSERT INTO [dbo].[結果テーブル] VALUES ('000111',3,'201905'); INSERT INTO [dbo].[結果テーブル] VALUES ('000107',2,'201812'); INSERT INTO [dbo].[結果テーブル] VALUES ('000108',3,'201809');

前提・実現したいこと

上記のような2つのテーブルがあります。
結果テーブルは社員のテスト結果の等級と実施日を持っており
加算テーブルは等級の加算ポイントを持っているテーブルとなります。

結果テーブルの等級と加算テーブルの等級を結びつけてポイントを求めたいのですが
加算テーブルのポイントは適用月によって加算されるポイントが変動します。

例:
等級0で2019年4月なら9ポイント
等級0で2019年5月なら10ポイント

ポイントを求める条件として、結果テーブルの実施月を加算テーブルの適用月と照らし合わせて
ポイントを算出したいと思っています。

試したこと

SELECT A.社員コード, A.等級, A.実施月, B.ポイント FROM 結果テーブル AS A LEFT JOIN 加算テーブル AS B ON A.等級 = B.等級

上記のようなクエリだと、結果テーブル1件に対して複数の加算テーブルが出力されます。
それを結果テーブルの実施月を条件としてポイントを取得することは可能でしょうか?

hihijiji👍を押しています

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

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

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

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

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

yambejp

2019/05/29 05:07 編集

データは画像だけではなくテキストでも貼ってください 可能であればcreate table/insertで例示してもらうとベター ちなみに、結果テーブルのid=7のように 適用月が加算テーブルの適用月のどれよりも低い場合は 加算を0とすればよいのでしょうか?
backfever

2019/05/29 05:35

回答有り難うございます。 CREATE TABLEとINSERTを追記いたしました。 yambejpさん >ちなみに、結果テーブルのid=7のように >適用月が加算テーブルの適用月のどれよりも低い場合は >加算を0とすればよいのでしょうか? 0で問題ありません。
guest

回答1

0

ベストアンサー

分析関数のLEADを使用して加算テーブルの適用月の範囲情報を求めたものと結合します。

SQL

1select t1.*, coalesce(t2.ポイント, 0) ポイント 2from 結果テーブル t1 3 left join ( 4 select *, lead(適用月, 1, '999999') over(partition by 等級 order by 適用月) 次適用月 5 from 加算テーブル 6 ) t2 7 on t1.等級 = t2.等級 and t1.実施月 >= t2.適用月 and t1.実施月 < t2.次適用月

上記では、leadにより次のデータが無い場合の値を999999とすることで範囲が判定されるようにしています。

投稿2019/05/29 05:32

編集2019/05/29 05:56
sazi

総合スコア25184

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

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

backfever

2019/05/29 07:14

回答有り難うございます。 上記のやり方で行けそうです。 LEAD関数というのがあるのですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問