【SQL】グループ化した際の最頻値の表示

このQ&Aのポイント
  • SQL Server 2008R2を使用して、販売支店と出身国でグループ化した際に、各グループの値段の合計値と最頻値の車種を表示する方法を教えてください。
  • 上記のテーブルを販売支店と出身国でグループ化し、値段の合計値を出力します。また、車種の中で最も頻出した値を表示する方法も教えてください。
  • SQL Server 2008R2を使用して、販売支店と出身国でグループ化した際に、各グループの値段の合計値と最頻値の車種を表示する方法を教えてください。最頻値が2つ以上ある場合は、その中からどれか1つを表示します。
回答を見る
  • ベストアンサー

【SQL】グループ化した際の最頻値の表示

はじめまして。 現在、私は仕事で統計を表示するためのレポートを作成中ですが、 データ取得SQLのよいアイデアが浮かびません。 わかる方がいらっしゃいましたら、お知恵を貸してください。 booking_id  販売支店  出身国    値段    車種 ---------------------------------------------- 01       東日本   ブラジル   100,000   A 02       東日本   ブラジル   200,000   A 03       東日本   ブラジル   300,000   B 04       東日本   ブラジル   400,000   C 05       東日本   日本     500,000   A 06       東日本   日本     600,000   B 07       西日本   ロシア    700,000   B 08       西日本   ロシア    800,000   B 09       西日本   ロシア    900,000   B 10       西日本   韓国     100,000   A 11       西日本   韓国     200,000   B 12       西日本   韓国     300,000   C 13       西日本   韓国     400,000   C 上記のようなテーブルがある場合、販売支店と出身国でグループ化して、 それぞれの値段の合計値を出します。 その際、車種はもっとも頻出した値を表示したいのですが、 どのようにしたら実現できますでしょうか。 (最頻値が2つ以上の場合は、その中のどれかを表示する。) 期待結果は以下のようになります。 販売支店   出身国    値段   車種 ---------------------------------------   東日本   ブラジル  1000,000   A   東日本   日本    1100,000   A   西日本   ロシア   2400,000   B   西日本   韓国    1000,000   C SQL Server は、2008R2を使用しております。 以上、よろしくお願いいたします。

  • losmy
  • お礼率100% (1/1)

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

1) 値段の集計 SELECT 販売支店, 出身国, SUM(値段) AS 値段 FROM テーブル GROUP BY 販売支店, 出身国 ORDER BY 販売支店, 出身国 (2)車種の頻度順 SELECT COUNT(*), 車種 FROM テーブル GROUP BY 車種 ORDER BY COUNT(*) DESC, 車種 (3) 合体 SELECT a.販売支店, a.出身国, SUM(a.値段) AS 値段 , (   SELECT TOP 1 b.車種   FROM テーブル b   WHERE b.販売支店 = a.販売支店 AND b.出身国 = a.出身国   GROUP BY b.車種   ORDER BY COUNT(*) DESC, b.車種 ) AS 車種 FROM テーブル a GROUP BY a.販売支店, a.出身国 ORDER BY a.販売支店, a.出身国

losmy
質問者

お礼

実際に試してみたところ、正しい値が得られました。 SELECT 区の中にテーブルを入れてしまう方法は初めて知りました。 とてもシンプルで、わかりやすい説明、ありがとうございました。

関連するQ&A

  • SQL文で統計表を作りたい

    お世話になります。 SQL文(SQLPLUS)で統計表を作りたいと思っています。 (PL/SQL可) 可能でしょうか? <販売履歴テーブル> 販売店 販売日付 販売時刻 A 2008/05/20 10:00 A 2008/05/20 15:00 A 2008/05/20 18:00 A 2008/05/21 11:00 A 2008/05/21 12:00 A 2008/05/21 15:00 A 2008/05/22 10:00 B 2008/05/20 09:00 B 2008/05/20 11:00 B 2008/05/21 10:00 B 2008/05/21 15:00 B 2008/05/21 17:00 C 2008/05/20 10:00 C 2008/05/20 11:00 C 2008/05/20 14:00 C 2008/05/21 10:00 販売店、販売日付にて件数を一覧表示させたい <SELECT結果> A B C 2008/05/20 3 2 3 2008/05/21 3 3 1 2008/05/22 1 0 0 ちなみにデータベースはOracle10gです。 よろしくお願い致します。

  • SQLサーバでテーブルをコピーする

    SQLサーバ超初心者です。 A支店用のテーブルを作成(dbo.data_A)したのですが B支店(dbo.data_B)、C支店用(dbo.data_C)のテーブルを作成したいです。 Accessなどのように、コピーペーストなどはできないのですよね? ご教授お願いいたします!

  • 条件文を使ったグループ出力SQL文

    SQL初心者です。な~んだこんな事くらいと言わず教えてください。 テーブルに A B C ------------ 5 a b 7 c d 4 a d 5 f b ------------ というデータがあります。 これを Bの列については、aとa以外 Cの列については、bとb以外 というようにグルーピングして、合計値を出したいと思っています。 結果として a b 5 a b以外 4 a以外 b 5 a以外 b以外 7 という形の出力イメージです。 調べてみてcase when文を使えばいいなんてことをなんとなく理解しているのですが、group byと組み合わせてどのようにSQL文を書けばいいかわかりません。 SQL Serverを使っています。ご存知の方、ご教授ください。

  • SQL

    SQLの初心者です。 次のようなテーブルがあるとします。 項目:A , B , C , D このテーブル合計を求めたいのです。 条件は、 同一テーブルでB=10の時のAの合計とD=10の時のCの合計の合計です。 B=10の時のAの合計は「sql sum(A) from テーブル where B=10」となります。 D=10の時のCの合計は「sql sum(C) from テーブル where D=10」となります。 この2つの合計を求めたいのです。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • SQL 繰り返し項目を表示

    以下の条件 カラム「C1」が主キーのテーブルがAとB↓ テーブルA C1| --- AA| テーブルB C1|C2| -----| AA|11| AA|22| AA|33| とあった場合に、抽出結果を C1|C2 | ---------| AA|112233| にするためにはどのようなSQLを組めばいいのでしょうか?

    • ベストアンサー
    • MySQL
  • SQLで必要なデータを取り出したい

    SQLにて以下のテーブルから必要なデータを取り出したいと思っています。 【支店テーブル:officetbl】 officenumber,officename(支店No,支店名) 001,東京支店 002,大阪支店 【取引先テーブル:partnertbl】 partnernumber,partnername(取引先No,取引先名) P001,A株式会社 P002,B有限会社 【工具テーブル:tooltbl】 partnernumber,toolnumber,toolname(取引先No,工具No,工具名) P001,T00001,工具A P001,T00002,工具B P002,T00003,工具C 【入荷(在庫)テーブル:arrivaltbl】 officenumber,partnernumber,toolnumber,arrival,stock(支店No,取引先No,工具No,入荷日,在庫) 001,P001,T00001,20150101,0 001,P001,T00001,20150110,2 001,P001,T00001,20150115,4 001,P002,T00003,20150120,2 001,P002,T00003,20150125,1 002,P002,T00003,20150105,2 これらのテーブルから、全拠点の場合と東京支店のみの場合、 2つのパターンでデータを取り出したいのですが、 どうSQLを組めば実現できるか分かりません。 【抽出後の結果(1):全拠点の場合】 officename,partnername,toolnumber,toolname,stock(支店名,取引先名,工具No,工具名,在庫) 東京支店,A株式会社,T00001,工具A,6 東京支店,A株式会社,T00002,工具B,0 東京支店,B有限会社,T00003,工具C,3 大阪支店,A株式会社,T00001,工具A,0 大阪支店,A株式会社,T00002,工具B,0 大阪支店,B有限会社,T00003,工具C,2 【抽出後の結果(2):東京支店のみの場合】 officename,partnername,toolnumber,toolname,stock(支店名,取引先名,工具No,工具名,在庫) 東京支店,A株式会社,T00001,工具A,6 東京支店,A株式会社,T00002,工具B,0 東京支店,B有限会社,T00003,工具C,3 どのようにコーディングしたら実現できるか、いろいろSQLを作成していますが、 うまく辿り着かないため、作業が進まなくて困っています。 どのようなSQLでしたら実現できるでしょうか?

  • SQLについて

    以下のSQLを作成したいです。 お助け下さい。 splserver2008 A(親)、B(子)、C(子)のテーブルがあるとします。 親キー:支店CD 子キー:グループCD 1、A、B、Cをジョイン 2、A、Cをジョイン 1、2を一覧表示させたいのですが、重複データは省きたいです。 しかもIs°?TY,T処理が必要な為、一緒に行カウントが必要になります。 これだけではやりたいことが伝わらないかもなので以外の狙いがあります。 A、Bはシステムでデータが作られます。 CはバッチでBのグループCDに向けて郵送が発生した情報を累積します。 上記2の処理は送っては行けないグループCDに送ってないか確認したいです。

  • GROUP BYを使うのでしょうか?SQL文がわかりません。

    以下のようなテーブルで、B社を担当していない人を検索したいのですが、 どのようなSQL文を書けばよいのでしょうか? 氏名 担当会社 -------------- 山田 A社 山田 B社 山田 C社 野村 A社 野村 C社 町田 A社 町田 B社 町田 C社 期待する結果 ----------- 野村 教えて下さい。 どうぞよろしくお願いいたします。

  • グループ化した個数をSQL文で書くと・・・

    大変、初心者的な質問で申し訳ありません。 下記のようなテーブルがあるとします。 --- 列1 列2 a いも b さくらんぼ a バナナ c りんご a いも --- 列1・列2でグループ化して、列1におけるの"グループの個数"を出したいと思っています。 つまり、結果としては、 a 2 b 1 c 1 という結果を望んでいます。 おそらくSQLを使われている方は非常に簡単だと思いますが、ご存知の方ご教授お願いします。

  • こんなSQL文

    Oracle8.1.7を使用しております。 以下のようなテーブルに対し、1行目と2行目を削除するSQL文を書きたいのですが、思いつきません。どなたか、アドバイスいただけないでしょうか? 表名:A   B | C ――――――――   2 | 10   2 | 1   1 | 10   1 | 1   1 | 11   1 | 2   1 | 1   3 | 10   2 | 3 変数として、P1=1とP2=2があります。(これは、SQL文の中に直接書くものとします。) ここで、SELECT B,C FROM A WHERE B=1;とSELECT B,C FROM A WHERE B=2;を実行すると、次のようになります。   B | C     B | C ――――――――― ―――――――――   1 | 10    2 | 10   1 | 1     2 | 1   1 | 11    2 | 3   1 | 2   1 | 1 ここで、それぞれの表を見ると、Cの値が一致している部分があります。この一致していて、Bが2の行を削除したいのですが、SQL1文では無理でしょうか? 最近、SQLには慣れてきたつもりだったのですが、こんなとこでつまずくとは・・・どうぞよろしくお願いします。