プロが教える店舗&オフィスのセキュリティ対策術

お世話になっております。
現在、SQLServer2000(SP4)を使用しています。

次の結果を求めるSQL文を作りたいのですが、中々上手く行きません。
良い方法を教えて下さい。

あるテーブル(tableA)にレコードが以下のようにあるとします。
【基本コード】【大分類】【中分類】
   1      1    3
   1      1    4
   1      2    1
   2      1    99
   2      18    1
   3      3    2

やりたい事は、【基本コード】毎に、【大分類】【中分類】の最小値を取得したいので、下記の結果を得たいのですが、

期待する結果↓
【基本コード】【大分類】【中分類】
   1      1    3
   2      1    99
   3      3    2

現在考えているSQL文では、下記のようになってしまいます。
実際の結果↓
【基本コード】【大分類】【中分類】
   1     1     3
   2     1     3
   3     3     3

現在考えているSQL文↓
SELECT
 基本コード,
 MIN(大分類) AS 大分類,
 (SELECT MIN(中分類) FROM tableA WHERE 大分類 = (SELECT MIN(大分類) FROM tableA) GROUP BY 大分類) AS 中分類
FROM tableA
GROUP BY 基本コード

中分類を求める場合の、大分類の指定の仕方が悪いのはわかるのですが、どう直したら良いのか分からず困っています。

宜しくお願いします。

A 回答 (1件)

SQL Server 2005の環境しかないのですが、「SQL Server 2000でも動くと思われるSQL」、「SQL Server 2005の機能を使ったSQL」の例を提示しておきます。



1.~SQL Server 2000
(1)概要
SQL Server 2000までは、インラインビューの利用範囲に制限がある(Oracle並には実装していない)と、マイクロソフトの機能比較で記載されています。実際にどの部分まで実装され、どの部分が未実装なのか不詳ですが、以下のSQLを試してみてください。

(2)SQL例
select x.基本コード,x.大分類,中分類
from (select 基本コード,min(大分類) as 大分類
from tableA
group by 基本コード) as x,
(select 基本コード,大分類,min(中分類) as 中分類
from tableA
group by 基本コード,大分類) as y
where x.基本コード=y.基本コード and x.大分類=y.大分類

2.SQL Server 2005~
(1)概要
SQL Server 2005で分析関数が実装されました。今回のようなケースに適用すると便利です。

(2)SQL例
select
基本コード,大分類,中分類
from (select
基本コード,大分類,中分類,
rank() over(partition by 基本コード order by 大分類,中分類) as rank
from tableA) as x
where rank=1
    • good
    • 0
この回答へのお礼

1.で教えて下さった方で、完璧に出来ました。
派生テーブルと言うものをこれまで1回しか使ったことがなかったのですが、これを機会にきちんと自分のものに出来るよう、理解しておきたいと思います。
2.で教えてくださった方も、今後2005を使うことになると思いますので、忘れないようにしておきたいと思います。

迅速でかつ正確に回答してくださり、本当に本当にありがとうございました。

お礼日時:2007/09/26 13:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す