こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQLの抽出条件の記述の仕方について

sqlのselect ~where等で以下のデータが抽出できますでしょうか。
テーブルに以下のデータが格納されています。
県コード  コード 商品名        単価
------------------------------------------------------------
01      1000 カメラ(中国製)   10,000円
01     2000 カメラ(日本製)   30,000円  
01      3000 カメラ(アメリカ製) 40,000円
------------------------------------------------------------
02      1000 カメラ(中国製)   10,000円
02      3000 カメラ(アメリカ製) 40,000円
------------------------------------------------------------
上記のようなデータのなから、一つの県から、1つの商品(コード:2000(カメラ(日本製))、3000(カメラ(アメリカ製))、1000(カメラ(中国製))の優先順位で1つを選択)をselect文で抽出可能でしょうか。上記のデータならば、以下のデータを抽出したいのですが。
01     2000 カメラ(日本製)   30,000円
02      3000 カメラ(アメリカ製) 40,000円
2件のみを抽出できますか。

投稿日時 - 2007-06-19 00:28:28

QNo.3096787

すぐに回答ほしいです

質問者が選んだベストアンサー

こんなかんじでどうでしょう?
未検証なので、多少の修正は必要だと思います。

DECODEを使用することで、コードを優先順位(1~3)に置き換えて、
その値が県コードごとの最小値であることをサブクエリを使用し、
条件にしています。
+--------------------------------------------+
SELECT T1.県コード,T1.コード,T1.商品名,T1.単価
FROM テーブル名 T1
WHERE DECODE(T1.コード,2000,1,3000,2,1000,3) =
(SELECT MIN(DECODE(T2.コード,2000,1,3000,2,1000,3))
FROM テーブル名 T2
WHERE T1.県コード = T2.県コード);

投稿日時 - 2007-06-19 11:20:24

お礼

早速の回答ありがとうございます。皆さんの回答のおかげで無事抽出する事ができました。本当にありがとうございました。

投稿日時 - 2007-06-20 00:50:12

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

こんな方法もあります。

select 県コード,
   substrb(max(decode(コード,2000,2,3000,1,0)
          || コード || ' ' || 商品名 || ' ' || 単価),2,
       lengthb(max(decode(コード,2000,2,3000,1,0)
              || コード || 商品名 || 単価)) + 1)
                       "コード 商品名 単価"
from tbl
group by 県コード;

先頭のdecode文(1桁)を非表示にするためsubstrbを使用しています。
lengthbの+1は表示データから半角スペース2つの連結を取り除いたものを
対象にしているため、decode桁数の差分(-1)に2が加えられ+1となります。

<実行例>

--
コード 商品名 単価
--------------------------------------------------------------------------------
01
2000 カメラ(日本製) 30000

02
3000 カメラ(アメリカ製) 40000

投稿日時 - 2007-06-19 14:03:15

お礼

早速の回答ありがとうございます。皆さんの回答のおかげで無事抽出する事ができました。本当にありがとうございました。

投稿日時 - 2007-06-20 00:51:42

分析関数を使うと、こんな感じ。

select 県コード,コード,商品名,単価
from
(select x.*,row_number() over(partition by 県コード order by DECODE(コード,2000,1,3000,2,1000,3)) R from TARGET)
where R=1

投稿日時 - 2007-06-19 12:37:36

お礼

早速の回答ありがとうございます。皆さんの回答のおかげで無事抽出する事ができました。本当にありがとうございました。

投稿日時 - 2007-06-20 00:51:16

ANo.2

こんな感じでどうでしょうか。
前提として県コードとコードで一意である必要があります。

WITH TMP AS (
SELECT
県コード,コード,商品名,単価
DECODE(コード,2000,1,3000,2,1000,3) AS コード順序
FROM テーブル
)
SELECT * FROM TMP
WHERE ( 県コード , コード順序) IN (
SELECT 県コード , MIN(コード順序) FROM TMP
GROUP BY 県コード
)

投稿日時 - 2007-06-19 11:56:50

お礼

早速の回答ありがとうございます。皆さんの回答のおかげで無事抽出する事ができました。本当にありがとうございました。

投稿日時 - 2007-06-20 00:50:44

あなたにオススメの質問