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

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

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

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

SQL

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

Q&A

解決済

3回答

1852閲覧

テーブルにある同じ番号で種類の違う複数レコードから最新の日付を取得したい

asr

総合スコア19

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2018/04/12 07:09

編集2018/04/12 09:08

以下のテーブルがあったとします。
テーブル名:tbl_table1

ID商品NO種類日付1日付2
110012018-04-03NULL
210012018-04-02NULL
31002NULL2018-04-05
41002NULL2018-04-04

ID:int型
商品NO:int型
種類:int型
日付1:datetime型
日付2:datetime型

このとき、
IDが「2」で種類が「1」の日付1の値(2018-04-02)と、
IDが「4」で種類が「2」の日付2の値(2018-04-04)を取得したいのですが、

SELECT 商品NO,MIN(CASE WHEN 日付1 IS NULL THEN '9999-01-01' WHEN 日付1 = 0 THEN NULL ELSE 日付1 END) as plnt, MIN(CASE WHEN 日付2 IS NULL THEN '9999-01-01' WHEN 日付2 = 0 THEN NULL ELSE 日付2 END) as plnk FROM tbl_table1 WHERE 商品NO=100 GROUP BY 商品NO

このSQLから条件を追加して実現したいのですが可能でしょうか。

最終的な結果が

商品NOplntplnk
1002018-04-022018-04-04

が望ましいです。

よろしくお願いいたします。

申し訳ございません。条件を詳しく書くと、
IDが「2」で種類が「1」の日付1の値(2018-04-02)はSQLでいうと、

SELECT TOP 1 商品NO,日付1 FROM tbl_table1 WHERE 種類=1 ORDER BY ID DESC

つまり、種類が「1」で一番最後に登録されたレコード を取得したいということです。
IDが「4」で種類が「2」の日付2の値(2018-04-04)も同様です。

日付1及び2はNULL以外にdatetimeの初期値(1900-01-01 00:00:00.000)も含まれる場合もあります。

説明不足により申し訳ございませんが、よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

条件が微妙ですね

仮にこうだとして

SQL

1create table tbl_table1(ID int,商品NO int,種類 int,日付1 date null,日付2 date null); 2 3insert into tbl_table1 values 4(1,100,1,'2018-04-03',NULL), 5(2,100,1,'2018-04-02',NULL), 6(3,100,2,NULL,'2018-04-05'), 7(4,100,2,NULL,'2018-04-04');

大抵IDはユニーク属性ですので、IDがxxで種類がyyのデータを抽出するとき
IDがxxだけでいいような気もします。
もちろんIDがxxのデータがあってもその種類がyyではない場合も
想定しているなら仕方ないですけどね

またIDが2で、種類が1のデータの日付2とIDが4で種類が2の日付1は
今回はたまたまともにNULLなので、NULLと実データの比較をすると
minでもmaxでも(場合によってはgroup_concatでも)拾えますけど、
仮にNULLじゃない場合はあるのかどうかも提示しないと、
そうとう回答はブレます。

それと今回はたまたま商品NOがともに100だからgroup by などで
処理できますが、違う場合はどちらの商品NOを優先するのか
仕様をきめる必要があります

以下サンプル

SQL

1select 商品NO,min(日付1) as plnt,min(日付2) as plnk 2from tbl_table1 where ID=2 and 種類=1 or ID=4 and 種類=2 3group by 商品NO 4 5

投稿2018/04/12 07:45

yambejp

総合スコア114572

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

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

sazi

2018/04/12 07:48

>group_concat SQL Serverということですが。
yambejp

2018/04/12 07:57

おっと失礼しました。minかmaxでお願いします
asr

2018/04/12 09:18

返答ありがとうございます。 sazi様の方にも書きましたが、こちらの不手際で、条件や値の説明不足していました。 申し訳ございません。
guest

0

日付1:datetime型
日付2:datetime型

なら、単純に下記でできませんか?

SQL

1SELECT 商品NO, MIN(日付1) as plnt, MIN(日付2) as plnk 2FROM tbl_table1 3WHERE 商品NO=100 4GROUP BY 商品NO

追記

商品NO、種類ごとのIDの最大のデータという事なら、最小の日付など関係ありませんね。

SQL

1select iv1.商品NO, iv1.日付1 as plnt, iv2.日付2 as plnk 2from ( 3 select * FROM tbl_table1 t1 4 WHERE 種類=1 and id=(select max(id) from tbl_table1 where 商品NO=t1.商品NO and 種類=t1.種類) 5 ) iv1 inner join ( 6 select * FROM tbl_table1 t1 7 WHERE 種類=2 and id=(select max(id) from tbl_table1 where 商品NO=t1.商品NO and 種類=t1.種類) 8 ) iv2 9 on iv1.商品NO=iv2.商品NO 10WHERE iv1.商品NO=100

投稿2018/04/12 07:22

編集2018/04/12 13:11
sazi

総合スコア25138

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

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

asr

2018/04/12 09:17

度々の返答ありがとうございます。 こちらの不手際で、条件や値の説明不足していました。 申し訳ございません。
guest

0

ベストアンサー

商品NO毎に出す必要があるならこうかなあ。
未検証です。『最新』とか『IDが最大』とかやりたいならapply系をおすすめします。
確かバージョン2008以降なら使えるはず。

sql

1select X.商品NO,lnt.日付1,lnk.日付2 2from ( 3 select 商品NO 4 from tbl_table1 5 group by 商品NO 6) as X 7 outer apply ( 8 select top 1 A.* 9 from tbl_table1 as A 10 where A.商品NO=X.商品NO 11 and A.種類ID=1 12 order by A.ID desc 13 ) as lnt 14 outer apply ( 15 select top 1 B.* 16 from tbl_table1 as B 17 where B.商品NO=X.商品NO 18 and B.種類ID=2 19 order by B.ID desc 20 ) as lnk

商品NOが主キーのテーブルがあればXは不要なんですが。

投稿2018/04/12 13:48

編集2018/04/12 14:21
sousuke

総合スコア3828

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

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

sazi

2018/04/12 14:17

へぇ、LATERALを実装してたんですね。 因みにorder byは日付ではなく、idでは?
sousuke

2018/04/12 14:20

「最新の日付」を勘違いしてました…サンプル通りだとIDです。ありがとうございます。直しときます(´・ω・`)
asr

2018/04/13 08:43

遅くなり申し訳ございません。 ようやく実データで試したところ、望み通りの結果が得られました。 その他、素早く返答くれた方々もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問