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

解決済みの質問

同行内の最大値

毎度お世話になります。以下の件で解かる方いらっしゃいましたら教えてください。

現在、以下のようなテーブルがあるとします。

ID | DATA1 | DATA2 | DATA3
1 | 100 | 200 | 300
2 | 250 | 350 | 100
3 | 400 | 100 | 200

これより、行毎にDATA1からDATA3までの範囲内での最大値を取得したいのですが、それは可能でしょうか?
以下のような感じで取得したいのです。

ID | 最大値
1 | 300
2 | 350
3 | 400

列の最大値ならMAXを使えばいいのでしょうが、同行内最大値となるとどのように書けば良いか検討が付きません。
スマートな方法があれば、ご教示お願いします。
環境は SQL Server 2005です。宜しくお願いします。

投稿日時 - 2007-12-20 11:51:42

QNo.3613413

困ってます

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

SELECT ID, fld_1 as 最大値 FROM TAB1 WHERE fld_1 > fld_2 AND fld_1 > fld_3
UNION
SELECT ID, fld_2 as 最大値 FROM TAB1 WHERE fld_2 > fld_1 AND fld_2 > fld_3
UNION
SELECT ID, fld_3 as 最大値 FROM TAB1 WHERE fld_3 > fld_1 AND fld_3 > fld_2

実行結果

ID|__最大値|
------------
__1|____300|
__2|____350|
__3|____400|

※ただし、 SQL Server 2000。
※ただし、基本文しか使っていないので多分・・・。

投稿日時 - 2007-12-20 13:17:44

お礼

あ、なるほど、UNION。
無理に一度にとろうとせず、DATA1が最大値となるとき、DATA2が最大値となるとき…といった感じで個別にとれば楽ですね。
CASE等つかって、強引に一気に取得しようとして頭がこんがらがった次第でございます(笑)。
この方法で検討したいと思います、ありがとうございました。

投稿日時 - 2007-12-20 15:10:04

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

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

回答(2)

ANo.2

データ列数が3つのみであれば、No.1の回答が最適かと思いますが、
実際にはもっと多数の列が存在するようであれば、IDとDATA列のみ
の別テーブルを作成した方がよろしいかと思います。

既存テーブルをTable1,新しいテーブルをTable2とした場合の例:

insert into Table2 (ID,DATA)
select ID , DATA1
from Table1
insert into Table2 (ID,DATA)
select ID , DATA2
from Table1
insert into Table2 (ID,DATA)
select ID , DATA3
from Table1



Table2からのクエリ例:

declare @i int
set @i = 1
while (select max(ID) from Table2) >= @i
begin
select ID ,DATA
from Table2
where DATA=
(select max(data)
from Table2
where ID=@i)
set @i = @i + 1
end

投稿日時 - 2007-12-20 14:18:40

お礼

そうです、実際比較したいカラムは3行より多いです。
繰り返し部分を正規化してテーブルを分割できればMAXが使えるので楽なのですが、レコード数が膨大になってしまうので難しいところです。
またテーブルを増やすと、データの追加や削除をしているプログラム部分も手を加えなければいけなくなるので、ちょっと厳しいですね。
というわけで、今回はNo.1さんのやり方の方で検討してみたいと思います。
アドバイスどうもありがとうございました。

投稿日時 - 2007-12-20 15:10:26

あなたにオススメの質問