プロが教えるわが家の防犯対策術!

お世話になります。

早速ですが、Topを使って上位3番までの値を抽出し、
その値を1レコードに出力させたいのですが、SQL文のみでの出力方法が思い浮かびません。
どなたか、知恵をお貸しください。

【通常の出力】
中国 39
米国 22
英国 12

【やりたい出力】
中国39 米国22 英国12

A 回答 (2件)

SQL Server2005でTOP句にOrderをつけている場合には、以下の書き方が可能です。


select
max(case when rownum=1 then country end),
max(case when rownum=1 then medal end),
max(case when rownum=2 then country end),
max(case when rownum=2 then medal end),
max(case when rownum=3 then country end),
max(case when rownum=3 then medal end)
from
(select top 3
row_number() over (order by medal desc) rownum,
country, medal
from beijing2008) tmp

この回答への補足

早速のご回答ありがとうございます。
考え方、非常に参考になりました。まさにその通りなんですが…
よくよく考えてみると別テーブルからの取得が必要でJoinしなきゃいけないことに気づきました。
今、話題の例が使えないので、ショボイ例になるのですが、

仕入テーブル
仕入先ID
商品名
仕入数量


仕入先マスター
仕入先ID
仕入先名

で、

出力が、
○○商店 うどん10 そば8 ラーメン6
△△食堂 そば10 うどん5 ラーメン3

という具合です。
私がやるとどうしても、JOINがうまく効かないので、アドバイスお願いします。

補足日時:2008/08/19 18:05
    • good
    • 0

こんな感じになるでしょう。



SELECT
仕入先名,
MAX(CASE WHEN ROWNUM=1 THEN 商品名 END),
MAX(CASE WHEN ROWNUM=1 THEN 数量 END),
MAX(CASE WHEN ROWNUM=2 THEN 商品名 END),
MAX(CASE WHEN ROWNUM=2 THEN 数量 END),
MAX(CASE WHEN ROWNUM=3 THEN 商品名 END),
MAX(CASE WHEN ROWNUM=3 THEN 数量 END)
FROM
(SELECT
(ROW_NUMBER() OVER (PARTITION BY m.仕入先ID ORDER BY t.仕入数量 DESC)) ROWNUM,
m.仕入先名
t.商品名,
t.仕入数量
FROM 仕入先マスター m
INNER JOIN 仕入テーブル t ON t.仕入先ID=m.仕入先ID) tmp
GROUP BY 仕入先名
    • good
    • 0
この回答へのお礼

ありがとうございます!
どーもJOINを使う抽出が苦手で…助かりました。
非常に参考になりました。

お礼日時:2008/08/20 08:59

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

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