• ベストアンサー

複数の値を1レコードに表示したい。

お世話になります。 早速ですが、Topを使って上位3番までの値を抽出し、 その値を1レコードに出力させたいのですが、SQL文のみでの出力方法が思い浮かびません。 どなたか、知恵をお貸しください。 【通常の出力】 中国 39 米国 22 英国 12 【やりたい出力】 中国39 米国22 英国12

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

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

a_lone_Bee
質問者

補足

早速のご回答ありがとうございます。 考え方、非常に参考になりました。まさにその通りなんですが… よくよく考えてみると別テーブルからの取得が必要でJoinしなきゃいけないことに気づきました。 今、話題の例が使えないので、ショボイ例になるのですが、 仕入テーブル 仕入先ID 商品名 仕入数量 仕入先マスター 仕入先ID 仕入先名 で、 出力が、 ○○商店 うどん10 そば8 ラーメン6 △△食堂 そば10 うどん5 ラーメン3 という具合です。 私がやるとどうしても、JOINがうまく効かないので、アドバイスお願いします。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

こんな感じになるでしょう。 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 仕入先名

a_lone_Bee
質問者

お礼

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

関連するQ&A