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

SQL文の書き方について教えてください。

商品  横   縦
A    1   3
A    1   4
A    2   5
A    3   5
B    1   3
B    1   4
B    1   5

上記表から、商品毎に、縦が最大(第1優先)で、横が最小の行をとってくるというSQLを書いて、以下のように取り出されるようにしたいと考えています。

商品  横   縦
A    2   5
B    1   5

SQL初心者でうまく書けませんでした。
どうかご指導お願いします。

A 回答 (7件)

ANo.6に結合条件が抜けていましたので補足します。


select b.商品, min(a.横), b.縦
from table a,
(select 商品, max(縦) 縦
from table group by 商品) b
where a.商品 = b.商品
and a.縦 = b.縦
group by b.商品, b.縦

これならうまくいくはずです。
    • good
    • 2

select b.商品, min(a.横), b.縦


from table a,
(select 商品, max(縦) 縦
from table group by 商品) b
group by b.商品, b.縦

こんな感じならいかがでしょうか?
    • good
    • 0

分析関数の使えるオラクルをお使いなら・・



select 商品,横,縦
from
(
select x.*,row_numnber() over(partition by 商品 order by 縦 desc,横) R
from hoge x
)
where R=1

で良いかと思います。

分析関数が使えないのであれば、

select distinct * from hoge x
where
not exists
(
select 1 from hoge y
where
x.商品=y.商品 and
(x.縦>y.縦 or (x.縦=y.縦 and x.横<y.横))
)

な感じで良いかと思います。(未検証ですが)
    • good
    • 0

【方法1】


select 商品,min(横) as 横,縦
from tbl1
where (商品,縦) in(select 商品,max(縦)
from tbl1
group by 商品)
group by 商品,縦;

【方法2】
select 商品,min(横) as 横,min(縦) as 縦
from tbl1
where (商品,縦) in(select 商品,max(縦)
from tbl1
group by 商品)
group by 商品;

※min(縦)はmax(縦)でも結果は同じです。
    • good
    • 0

こんな感じでしょうか?



select a.商品,min(b.横),a.max縦 from
(select 商品,max(縦) as max縦 from test group by 商品) a
inner join test b
on (a.商品=b.商品 and a.max縦=b.縦)
group by a.商品,a.max縦

これでいけると思うのですが、どうでしょうか?
    • good
    • 0

いくつか書き方はあると思いますが


とりあえずこんな感じでどうでしょう

SELECT 商品, Min(横), 縦
FROM テーブル
WHERE 縦 = (SELECT MAX(縦) FROM テーブル)
GROUP BY 商品, 縦;

詳細は「サブクエリ」あたりを検索してみてください

この回答への補足

WHERE 縦 = (SELECT MAX(縦) FROM テーブル)
のように書いてしまうと、テーブルの最大値をとって
きてしまうと思います。

商品ごとに最大値が違う場合は成り立たないですよね?

補足日時:2006/02/10 20:27
    • good
    • 0

select 商品, min(横), max(縦) from tbl group by 商品

この回答への補足

これだと以下のようになると思います。

商品  横   縦
A    1   5
B    1   5

補足日時:2006/02/10 20:24
    • good
    • 1

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