- PR -

SQL Server 2005:WHERE句で複数条件のある IN の使い方を教えてください。

1
投稿者投稿内容
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2008-04-01 18:36
こんにちは。よろしくお願いします。

以下のようなデータがあります。

コード | 日付 | 数量
-------------------------
01001 | 3/15 | 2
01001 | 3/30 | 4

同一商品コードで日付の最も大きい明細がほしい時、Oracleでは次のようなSQL文を実行しておりました。

SELECT コード、日付、数量 FROM
(SELECT コード、日付、数量 FROM テーブル WHERE (コード,日付) IN (SELECT コード,MAX(日付) FROM コード GROUP BY 日付))

単純に SELECT コード,MAX(日付),数量 FROM テーブル GROUP BY コード、数量

としてしまうと、数量が異なるため、3/15 と 3/31 日 両方のデータが出力されるためサブクエリを作って最も大きい日付しか出ないようにしていました。

これをSQLServerで実行すると、エラーになってしまいます。

何か代替の方法はないでしょうか?

よろしくお願いします。
close dance
会議室デビュー日: 2008/03/28
投稿数: 9
投稿日時: 2008-04-01 19:43
select b.*
from (select a.*
, row_number() over (partition by コード order by 日付 desc) rownum
from [テーブル] a) b
where b.rownum=1
で取得できます。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-04-01 22:33
SQL Serverは、主要RDBMSの中で唯一といってもいいかも知れませんが、SQL99で規定された「行値構成子(row value constructor)」(「行値式」と呼ぶ場合もある)を実装していません。

SQL例をいくつか示します。SQL例4は、SQL Server 2005以降のみ実行可能です。

1.SQL例1
コード:
select *
 from t1 as x
 where 日付=(select max(日付) 
              from t1
              where x.コード=コード)
 order by コード



2.SQL例2
コード:
select *
 from t1 as x
 where not exists(select 1 
                   from t1
                   where x.コード=コード
                   -- group by コード
                    having x.日付<max(日付))
 order by x.コード




3.SQL例3
コード:
select *
 from t1 as x
 where 日付=all (select max(日付)
                  from t1
                  where x.コード=コード) 
 order by x.コード



4.SQL例4
コード:
select *
 from (select *,row_number() over(partition by コード order by 日付 desc) as rn
        from t1) as x
 where x.rn=1
 order by x.コード

忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-04-01 22:39
SQL例3の例題が不適切だった(サブクエリでALLを使う意味がなかった)ので、訂正します。

3.SQL例3
コード:
select *
 from t1 as x
 where 日付>=all (select 日付
                  from t1
                  where x.コード=コード) 
 order by x.コード

ノラ
常連さん
会議室デビュー日: 2003/11/06
投稿数: 37
お住まい・勤務地: 東京都
投稿日時: 2008-04-02 14:21
別解の一例です。
select t1.*
from t as t1 inner join
( select コード,max(日付) as 日付 from t group by コード ) as t2
on t1.コード=t2.コード
and t1.日付=t2.日付
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2008-04-02 14:37
close danceさま
忠犬さま
ノラさま

ご返信ありがとうございます。
非常に参考になりました。

ありがとうございました。
1

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