- PR -

sqlについて

1
投稿者投稿内容
さぷり
会議室デビュー日: 2007/06/17
投稿数: 2
投稿日時: 2007-06-17 12:57
はじめまして。どうしても自分では解決できないので、
どなたかSQLに詳しい方がいらっしゃったら
教えていただけないでしょうか?

以下、二つのテーブルがあります。

■店番マスターテーブル
店No 店名
00001 AAA
00002 BBB
00003 CCC
00004 DDD
00005 EEE
00006 FFF


■確認日テーブル
店No 店名 年月 確認日
00001 AAA 200604 20060401
00005 EEE 200604 20060405
00004 DDD 200604 20060407
00002 BBB 200604 20060403
00003 CCC 200604 20060402
00006 FFF 200604 20060401
00002 BBB 200605 20060501
00005 EEE 200605 20060503
00004 DDD 200605 20060502

取り出したい結果
店No 店名 年月 確認日
00001 AAA 200604 20060401
00002 BBB 200604 20060403
00003 CCC 200604 20060402
00004 DDD 200604 20060407
00005 EEE 200604 20060405
00006 FFF 200604 20060401
00001 AAA
00002 BBB 200605 20060501
00003 CCC
00004 DDD 200605 20060502
00005 EEE 200605 20060503
00006 FFF

月に1回,店ごとにある確認を行っていて
確認すると確認日テーブルに記録が残ります。
(上の確認日テーブルには4月と5月の記録しか書きませんでしたが・・)
取り出したい結果は2か月分の店番号、店名、年月、確認日なのですが
5月にはまだ確認ができていない店もあるので、その場合年月と確認日は空白にします。

こういう風に結果を取り出すためのsqlを書くことは可能でしょうか・・?

忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-06-17 16:07
使用するRDBMSとそのバージョンは?

各列のデータ型も、念のため示してください。
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2007-06-17 20:36
まず、確認日テーブル に 店名 は不要と思います。
コード:
SELECT TM.店No, TM.店名, K.年月, K.確認日

FROM 店番マスターテーブル TM
INNER JOIN
(SELECT DISTINCT 年月
FROM 確認日テーブル
) YM
ON 0=0
LEFT OUTER JOIN
確認日テーブル K
ON K.店No = TM.店No
AND K.年月 = YM.年月
ORDER BY YM.年月, TM.店No;


CROSS JOIN が使えれば、INNER JOIN の代わりに使えると思います。


[ メッセージ編集済み 編集者: とんくま 編集日時 2007-06-20 23:54 ]
さぷり
会議室デビュー日: 2007/06/17
投稿数: 2
投稿日時: 2007-06-17 22:34
返信ありがとうございます。
参考になります。

>忠犬さん
Oracle10i データ型はすべてVARCHARです

ちなみに、取り出した結果から
さらに特定の店番のデータのみを取り出す場合
また、5月に確認日がない(空白になっているもの)のみを取り出す場合はどうすればいいでしょう?
別にSQLを考えたほうがいいでしょうか?
dodo
ベテラン
会議室デビュー日: 2004/05/12
投稿数: 99
お住まい・勤務地: 東京都渋谷区
投稿日時: 2007-06-19 01:47
引用:

さぷりさんの書き込み (2007-06-17 22:34) より:

ちなみに、取り出した結果から
さらに特定の店番のデータのみを取り出す場合
また、5月に確認日がない(空白になっているもの)のみを取り出す場合はどうすればいいでしょう?




インラインビューについて調べてみれば、幸せになれるかもしれません。
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2007-06-19 18:27
ちなみに、取り出した結果から
さらに特定の店番のデータのみを取り出す場合

コード:
SELECT TM.店No, TM.店名, K.年月, K.確認日
  FROM 店番マスターテーブル TM
       INNER JOIN
       (SELECT DISTINCT 年月
          FROM 確認日テーブル
       ) YM
         ON 0=0
       LEFT OUTER JOIN
       確認日テーブル K
         ON  K.店No = TM.店No
         AND K.年月 = YM.年月
 WHERE TM.店No = 00003
 ORDER BY YM.年月, TM.店No;



また、5月に確認日がない(空白になっているもの)のみを取り出す場合はどうすればいいでしょう?
別にSQLを考えたほうがいいでしょうか?

コード:
SELECT TM.店No, TM.店名, K.年月, K.確認日
  FROM 店番マスターテーブル TM
       INNER JOIN
       (SELECT MAX(年月)
          FROM 確認日テーブル
       ) YM
         ON 0=0
       LEFT OUTER JOIN
       確認日テーブル K
         ON  K.店No = TM.店No
         AND K.年月 = YM.年月
 WHERE K.確認日 IS NULL
 ORDER BY YM.年月, TM.店No;


よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-06-19 20:39
引用:

とんくまさんの書き込み (2007-06-17 20:36) より:
(SELECT DISTINCT 年月
FROM 確認日テーブル
) YM



これだと、全ての店がまだ未確認の時は年月が取れません。
質問者の仕様によりますが、年月のみのテーブルを別に持つのも良いと思います。
50年分持ってもたった600レコードですし。
一時テーブルでも良いです。
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2007-06-20 00:35
> これだと、全ての店がまだ未確認の時は年月が取れません。
> 質問者の仕様によりますが、年月のみのテーブルを別に持つのも良いと思います。
> 50年分持ってもたった600レコードですし。
> 一時テーブルでも良いです。
そもそも、(質問者の仕様によりますが)
1)今の時点(例えば、200706)における未確認の 店No を知りたいのでしょうか?
2)あるいは、指定した年月における未確認店の情報が知りたいのでしょうか?
もし、1)あるいは 2)ならば、(質問者の使っている DBMSが Oracle ということですが、私はOracleに詳しくないので間違っているかもしれませんので、そこのところはご勘弁下さい。なんらかのヒントになれば幸いです。)、以下で可能と思います。
逆に、確認日テーブルにあるデータでの最新年月における未確認 店No を知りたいのであれば私の直前の書き込みのSQL文が適当と思います。
1)
コード:
SELECT TM.店No, TM.店名, K.年月, K.確認日

FROM 店番マスターテーブル TM
INNER JOIN
(SELECT TO_CHAR(CURRENT_DATE, 'YYYYMM')
FROM DUAL
) YM
ON 0=0
LEFT OUTER JOIN
確認日テーブル K
ON K.店No = TM.店No
AND K.年月 = YM.年月
WHERE K.確認日 IS NULL
ORDER BY YM.年月, TM.店No;


2)
コード:
SELECT TM.店No, TM.店名, K.年月, K.確認日

FROM 店番マスターテーブル TM
INNER JOIN
(SELECT '200705' FROM DUAL
) YM
ON 0=0
LEFT OUTER JOIN
確認日テーブル K
ON K.店No = TM.店No
AND K.年月 = YM.年月
WHERE K.確認日 IS NULL
ORDER BY YM.年月, TM.店No;






[ メッセージ編集済み 編集者: とんくま 編集日時 2007-06-20 00:39 ]
1

スキルアップ/キャリアアップ(JOB@IT)