• ベストアンサー

複数の値を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

  • レコードの抽出

    PerlCGIでSQL-ENGINE.plというライブラリを使ってSQLを実行しています。最も結構ローカルなフリーのライブラリだから(作った人におこられるか)それの使い方を教えてくださいという訳ではありません。 一般的な形で結構ですので、SQL文を教えてもらいたいのです。 例えば select * from テーブル where 抽出条件 order by 何かの基準で降順並替え; として、さらにこの抽出結果の上から11番目のレコードから20番目のレコードだけを抽出したいとすると、これにどのようなSQL文を追加したらよいのでしょう。

  • ACCESSで抽出したフィールドに同じレコードにある値を複製したい

    A、B、Cという列があって、Aの列の値が空欄(NULL)であるレコードを抽出し、そのレコードのAの列にBの値をコピー(複製)したいのですが・・・・  説明が下手ですみません。もしクリエで不可能な場合、SQLで記述可能でしょうか。その記述文も教えていただけると助かります。よろしくお願いします。

  • 複数レコードの値を合計したときに値が正しいか検査?

    SQLで複数レコードにある値を合計したときに値が正しいか検査をして、整合性が取れないものを抽出したいのですが・・・ 例えば、イラストのようにテーブルがあるとします。 実験管理番号、バージョンがキーになっております。 変化履歴というのは分数を文字列型で入れているものです。 AAA001で行けば、20回の検査をしています。 まず、5回目に変化、その後 11回後の16回目、その後 2回後の18回目、その後 2回後の20回目とレコードを作成しています。 つまり分母と分子の合計が一致しなくてはいけません。 ただ、その中でも BBB001のV1 と TTT005のV7データが 分母と分子の数が一致しません。 こういったデータを抽出させたいのですが、文字列データでもあるためどのように不適切データを検索したらいいのか悩んでいます。 詳しい方いらっしゃいましたらご教示いただけませんでしょうか?

  • ACCESS2003:2番目に大きい値を1レコードのみ抽出

    氏名、ポイントと2つのフィールドをもつテーブル1をもとにクエリ1を作成し、クエリデザインでDMax("[ポイント]","クエリ1","[ポイント]<=" & DMax("[ポイント]","クエリ1"))といった2番目に大きい値(1番目の値が2つ以上ある場合はその値で可)を抽出する式をつくりました。抽出条件に任意の氏名を指定した結果、2番目に大きい値は抽出できましたが、ポイントのデータ数ぶんだけ複数のレコードを表示してしまいます。できれば別のクエリを作成したりせずに、1つのレコードのみ表示させたいのですがどのようにしたらよいか分からず困っております。よろしくお願いします。

  • 抽出対象の1レコードを複数レコードへ変更し出力する方法を

    抽出対象の1レコードを複数レコードへ変更し出力する方法を SQLで教えてください。(SQLServer2000です。) <イメージ> 店番 顧客番号 年月  A B C D ・・・(Dのあと100項目つづく)・・・ 1000 12345678 200909 10 20 30 40 2000 12345678 200910 30 40 50 60 を 店番 顧客番号 年月  AからD 1000 12345678 200909 10 1000 12345678 200909 20 1000 12345678 200909 30 1000 12345678 200909 40 2000 12345678 200910 30 2000 12345678 200910 40 2000 12345678 200910 50 2000 12345678 200910 60 と出力したいのですが、SQLServer2000ではPIVOT等が使用できず。 抽出処理が思いつきません。 パフォーマンスも悪くなったりしますか。 何か良い方法をご教示ください、よろしくお願い致します。

  • 2つのフィールドの値が同じレコードをひとつと見なす

    id     field1     field2 1      1        A 2      1        A 3      1        B 4      2        A 5      2        B 6      2        C 7      3        D 8      3        D 9      3        D field1とfield2の値が他のレコードのfield1とfield2と重複している場合はひとつのデータとして返したいです。 id1.2はfield1とfield2の値が同じなので、ひとつのデータしか返しませんが、id3はfield2が異なるので返します。 id4.5.6はいずれもfield2の値が異なるので4.5.6全てを返します。 id7.8.9はfield1とfield2が同じ値なのでひとつのデータしか返しません。 id 1 3 4 5 6 7 該当するレコードは上記のように6個となるようにするにはどのようなsql文を発行すれば良いでしょうか? ご教示頂けますと幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • レコードセットからレコードセットって作れますか?

    WindowsXP,VB6,SP5,で開発しています。 タイトルそのままなのですが、 ある事情で、まずはデータベース(Access)からレコードセットを作成しています。 そのレコードセットをもとに色々と抽出したいんです。 もし、データベースからSQL文で抽出するときみたいに、そのレコードセットを、 SUM(~とかGROUP化したりとかできればいいなあと思っているのですが、 その方法がわからず、2,3回遠回りしてレコードセットを作成してます。 レコードセットからレコードセットを作成することってできないのでしょうか? わかりにくくてすみませんが、どうぞよろしくお願いしますm(_ _)m

  • 複数列の最大

    初心者です。 SQL文で1レコード中の同一バイト数の複数列の最大を抽出したいのですが、書き方がよくわかりません。 A1|A2|A3|A4|A5 の時、A1~A5までで最大の値を抽出したいのですが・・ 何かよい方法がありますか?

  • VBA 上位3位までの値をラベルに表示するには

    いつもお世話になっております。 初心者ですが、宜しくお願いします。 ご教授願いたいのは、上位3位までと、下記3位までの値を抽出し、 それぞれをユーザーフォーム上のラベルへ表示したいのです。 (例 ( sheet1 )   A   1 20   2 15  3 40  4 25  5 30  6 60  7 55      ↓ ↓ ユーザーフォームには ラベル1 ~ ラベル6まであります。 上記のA列の中から上位3位までを抽出し、ラベル1~ラベル3へ表示。 ラベル4~ラベル6に下位3件の値を抽出、表示させたいのです。 現在は手動でLARGE関数、SMALL関数で一度sheet2に書き出した後、 そのセルの値を表示するようにしていますが、 値も日々動的に増えていきますので、 別シートを使わず直接プログラムできればと思います。 素人のためうまく説明できませんが、 どうぞ皆様のお知恵をお貸しください。 宜しくお願いいたします。

  • 複数レコードのテーブルであるレコードだけ増やしたい

    お世話になります。 複数レコードがあるテーブルにて、あるレコードだけカウントアップする為のSQL文はどのように記述すれば良いでしょうか? 要件: テーブル名'名簿'の No, 名前, 更新者, 備考に 01, 芥川龍之介, ほげ太, NULLを入力し 備考は書き込みさせるためとりあえずNULLを代入しておき 名前と更新者は同じで、Noの部分だけを01~10までカウントアップさせたい 何卒、ご教授のほど、宜しくお願いします。

このQ&Aのポイント
  • LAVIE NS500/Nのパスワードリセット方法について教えてください。USBフラッシュドライブが必要です。
  • LAVIE NS500/Nのパスワードリセット方法について教えてください。リムーバルメディアが必要です。
  • LAVIE NS500/Nのパスワードリセットが必要です。リムーバルメディアが必要ですが、どのような手順で行えばよいですか。
回答を見る