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

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

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

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

SQL

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

Q&A

解決済

2回答

7111閲覧

2つSQL文の結果を比較し、同じ番号のデータがある場合は小さい方を取得し、結合したい

asr

総合スコア19

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2017/11/09 08:16

例えば以下のようなSQL文とその結果があったとします。
※もっとスマートなSQL文にできると思いますが。

更新日時:datetime
種類:int
ID:int

select MIN(case WHEN 更新日時 IS NULL THEN '9999-01-01' WHEN 更新日時 = 0 THEN NULL ELSE 更新日時 end) as koushin,ID from tbl_file where 種類=22 group by ID

結果:

koushinID
2017-10-0918
2017-10-1019

date1:datetime
date2:datetime
NO:int

select tnou.nou,tnou.NO from (select MIN(case when plnt<plnk then plnt else plnk end) as nou, NO from (select NO,MIN(case WHEN date1 IS NULL THEN '9999-01-01' WHEN date1= 0 THEN NULL ELSE date1 end) as plnt, MIN(case WHEN date2 IS NULL THEN '9999-01-01' WHEN date2 = 0 THEN NULL ELSE date2 end) as plnk from tbl_report group by NO) as mt group by mt.NO) as tnou

結果:

nouNO
2017-10-1117
2017-10-1218
2017-10-1320

この二つのSQLを結合し、
IDとNOが同じ番号だった場合は、古い日付の方を取得して結合したいです。

###理想の結果:

日付番号
2017-10-1117
2017-10-0918
2017-10-1019
2017-10-1320

この結果が実現できるSQLはできますでしょうか。

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

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

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

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

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

guest

回答2

0

解決済みですが、一応別解ということで。
ポイントは、SQLServerには無いLeast()を疑似的に行っているということです。
テーブル値コンストラクターをFROM句の派生テーブルとして使用する。

SQL

1select min(least) as 日付,番号 2from ( 3 select (select min(item) from (values (plnt),(plnk),(koushin)) as list(item)) as least, 番号 4 from ( 5 select coalesce(NO, ID) as 番号 6 , case WHEN date1 IS NULL THEN '9999-01-01' WHEN date1=0 THEN NULL ELSE date1 end as plnt 7 , case WHEN date2 IS NULL THEN '9999-01-01' WHEN date2=0 THEN NULL ELSE date2 end as plnk 8 , case WHEN 更新日時 IS NULL THEN '9999-01-01' WHEN 更新日時=0 THEN NULL ELSE 更新日時 end as koushin 9 from tbl_report as t1 10 full outer join (select ID, 更新日時 from tbl_file where 種類=22) as t2 11 on t1.NO=t2.ID 12 ) as mt 13) as tnou 14group by 番号

投稿2017/11/09 10:51

編集2017/11/09 10:54
sazi

総合スコア25184

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

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

0

ベストアンサー

UNION ALLして番号でgroup byして min(日付)を取ればよいのでは?

投稿2017/11/09 08:40

yambejp

総合スコア114814

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

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

asr

2017/11/09 10:28

ありがとうございました。 まさしく、UNION ALLして番号でgroup byして min(日付)を追加でいけました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問