teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

SQL

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

Q&A

解決済

1回答

320閲覧

SQLServerでの2つのテーブルからのデータ作成方法について

hrmtatyk

総合スコア1

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2023/04/30 20:55

編集2023/05/01 00:46

0

0

お世話になっております。
SQLServerについて分からないことがあり質問させて頂きます。
JOINやHAVING区だけでは上手く条件設定が出来ず悩んでおります。
以下の課題を解決するための構文をご教示いただけないでしょうか?

宜しくお願い致します。

実現したいこと

SQL Serverを使って下記2つのテーブルから適切なデータを所得する
①時点の履歴を持つテーブル引用テキスト
➁時点の価格を持つテーブル

前提

①時点の履歴を持つテーブル
製品 数量 出荷日付ボールドテキスト
ーーーーーーーーーーーーー
A  100 2023/01/01
A 200 2023/01/04
A 150 2023/02/01
B 100 2023/01/03
B 200 2023/01/14
B 150 2023/02/04

➁時点の価格を持つテーブル
製品 価格 適用日付
ーーーーーーーーーーーーー
A 10,000 2023/01/01
A 15,000 2023/01/23
A 18,000 2023/02/13
B 7,000 2023/01/01
B 8,000 2023/02/01

最終的に得たいデータ
出荷日付から時点の適切な価格を反映したデータになっている。
製品 数量 出荷日付 価格
ーーーーーーーーーーーーー
A  100 2023/01/01 10,000
A 200 2023/01/04 10,000
A 150 2023/02/01 15,000
B 100 2023/01/03 7,000
B 200 2023/01/14 7,000
B 150 2023/02/04 8,000

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

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

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

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

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

m.ts10806

2023/04/30 23:04

質問タグにつけられているPL/SQLはOracleの機能となるので本件と無関係です。外してください https://teratail.com/tags/PL%2FSQL
m.ts10806

2023/04/30 23:05

また、質問がないです。 作業依頼になっています。 自身が取り組んだ結果、起きてる問題や解決したいことについて質問してください
hrmtatyk

2023/05/01 00:47

こんにちは。初めての投稿で不慣れなためルールを把握しきれておらず申し訳ございませんでした。 修正させて頂きました。今後とも宜しくお願い致します。
m.ts10806

2023/05/01 00:58

作業依頼になってる件は修正されていません
guest

回答1

0

ベストアンサー

「➁時点の価格を持つテーブル」の「適用日付」はその価格が適用され始めた日という認識ですが、正しいでしょうか? この認識が正しいのであれば、以下のようなSQLで実現可能かと思います。

SQL

1SELECT X.製品, X.数量, X.出荷日付, Y.価格 2FROM TBL1 AS X 3JOIN ( 4 SELECT 5 製品, 6 価格, 7 適用日付 AS 適用開始日付, 8 LEAD(適用日付, 1, '9999-12-31') OVER (PARTITION BY 製品 ORDER BY 適用日付) AS 適用終了日付 9 FROM TBL2 10) AS Y ON X.製品 = Y.製品 AND Y.適用開始日付 <= X.出荷日付 AND X.出荷日付 < Y.適用終了日付;

LEAD関数を利用して、製品ごとにその価格が適用開始になった日と適用終了になった日の一覧を作成し、この一覧と「①時点の履歴を持つテーブル」を結合しています。適用終了になった日が求められない場合は9999-12-31を番兵として利用しています。

投稿2023/05/01 05:52

neko_the_shadow

総合スコア2395

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

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

hrmtatyk

2023/05/02 01:50

お世話になっております。 ご返答ありがとうございます。 全く手が動かなかったため質問しましたが、サンプルありがとうございます。 LEAD関数も知らなかったため、動きを確認させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問