• ベストアンサー

sum()の出力結果順に並び替えをするSQL文

皆さん、こんばんは。 mysql 3.23.49-8.13 を使用しています。 mysql> select name,team_name,sum(point),count(*),max(size),min(size) from data where kind = 'hoge' group by name; とした時、 +------+---------+----------+--------+---------+---------+ | name |team_name|sum(point)|count(*)|max(size)|min(size)| +------+---------+----------+--------+---------+---------+ | hro | | 25 | 2 | 46 | 42 | | hro2 |Project-F| 15 | 1 | 47 | 47 | | hro3 |Project-F| 90 | 5 | 66 | 39 | +------+---------+----------+--------+---------+---------+ という結果が得られるのですが、 +------+---------+----------+--------+---------+---------+ | name |team_name|sum(point)|count(*)|max(size)|min(size)| +------+---------+----------+--------+---------+---------+ | hro3 |Project-F| 90 | 5 | 66 | 39 | | hro | | 25 | 2 | 46 | 42 | | hro2 |Project-F| 15 | 1 | 47 | 47 | +------+---------+----------+--------+---------+---------+ というように、sum(point) 順に並べた結果を得るには、どのようなSQL文を発行したらよいのでしょうか? select name,team_name,sum(point),count(*),max(size),min(size) from data where kind = 'hoge' group by name order by sum(point) desc; ってやれると楽だったんですが・・・・・(^^; お知恵をお貸しください。

  • MySQL
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
回答No.2

ORDER BYは番号でも指定できるし、名前を付ける方法もあります。 (1)ORDER BYで参照するために、名前を付ける select name,team_name,sum(point) as x, ~  from ~ where ~ order by x desc (2)SELECTする並びの何番目かで指定する select name,team_name,sum(point), ~  from ~ where ~ order by 3 desc

Blackwingls
質問者

お礼

新年早々、ご回答いただきましてありがとうございます。 今回は、(2)の方法を採用いたしまして、無事思ったとおりの出力結果を得ることができました。 as の方法も使い勝手がよさそうなので、今後試していきたいと思います。 大変ありがとうございました。

その他の回答 (1)

  • hola1973
  • ベストアンサー率45% (5/11)
回答No.1

以下のように一度 AS で名前を付けてからORDERするとうまくいきます。 select name,team_name,sum(point) AS p,count(*),max(size),min(size) from data where kind = 'hoge' group by name order by p desc;

Blackwingls
質問者

お礼

ご回答ありがとうございます。 質問を投稿後、chukenkenkou様の(2)の方法を思いつきやってみたところ上手くいきました。 まだまだ、初心者ゆえ思った結果がでず悪戦苦闘の日々です。 AS の方法も今後試してみたいと思います。 新年早々、ありがとうございました。

関連するQ&A

  • SQL文を教えてください。

    MYSQLを使っています。 【売上テーブル】 || 日付 || 金額 || ----------------- || 2011/01/01 || 100 || || 2011/01/01 || 200 || || 2011/01/02 || 600 ||           ・           ・           ・ || 2012/12/31 || 500 || || 2012/12/31 || 100 || SELECT SUM(金額) FROM 売上テーブル WHERE 日付 BETWEEN '2011-01-01' AND '2011-12-31' GROUP BY DATE_FORMAT(日付, '%Y/%m') で月初から月末のデータを表示させることはできますが、 2011/01/10~2011/02/09を一か月として 以降は 2011/02/10~2011/03/09 2011/03/10~2011/04/09        ・        ・        ・ 2011/12/10~2012/01/09 といった感じに1年間のデータを表示させる方法がわかりません。 どうぞ宜しくお願いします。

    • ベストアンサー
    • MySQL
  • 1つのsql文でデータを取得したい

    phpとmysqlを連携させデータを取得しています。mysql5です。 現在は2つのテーブルからデータを取得するため以下のように2回のsql文を発行しています。 $sql = 'SELECT products_id, name, products_flag, comment1, IF("' . $products->beforedays . '" < DATE(create_date), "1", "0") as new, FROM products WHERE status = ? AND del_flg = ? ORDER BY create_date DESC'; // 1回目のsqlで取得したproducts_idを参照し下記のsqlを実行 $sql = 'SELECT MIN(price1) as min_price1, MAX(price1) as max_price1, MIN(price2) as min_price2, MAX(price2) as max_price2, IFNULL(price2, price1) as price0, stock FROM products_class_detail WHERE products_id = ?'; これを1回のsqlにまとめる場合どのような書き方になるでしょうか? 自分なりに下記のようにしてみたところ動作はするのですが複数のデータが条件に 当てはまるはずがminとmaxがあるためか条件に当てはまる最後のデータのみしか 取得されませんでした。 ※試しにmin,maxを外すと複数のデータを取得できました。 $sql = 'SELECT products.products_id, products.name, products.products_flag, products.comment1, IF("' . $products->beforedays . '" < DATE(products.create_date), "1", "0") as new, MIN(products_class_detail.price1) as min_price1, MAX(products_class_detail.price1) as max_price1, MIN(products_class_detail.price2) as min_price2, MAX(products_class_detail.price2) as max_price2, IFNULL(products_class_detail.price2, products_class_detail.price1) as price0, products_class_detail.stock FROM products, products_class_detail WHERE products_class_detail.products_id = products.products_id AND products.status2 = ? AND products.del_flg = ? ORDER BY' . $where_sql; 商品の情報を取得するsqlで最後のorder句は商品の並び順の変更でユーザーの指定した 順番(新着順や価格順等)で表示するためのものです。 2回のsqlの場合は問題なく動作していたのですがで新着順や価格順に並び替えを行うため 1回のでsqlで行いたいと思っております。 新着順の場合は1回目のsqlに条件が入るので問題ないのですが価格順の場合は2回目の sqlに条件が入るので2回のsqlではうまく並び替えができませんでした。 ソースの短縮にもなり可能であれば1回のsqlで完結させたいのですがどうすればいいものか わからずつまづいております。 詳しい方がいらっしゃいましたら宜しくお願い致します。

  • SQL文について質問があります。

    PostgreSQLのSQL文で質問があります。 kekktaテーブルの構成 ---------------------- name:varchar(64) score : int 4 day : date ---------------------- 現在kekkaテーブルには以下のレコードが格納されています。 ------------------------------- yamada| -2|2003-04-30 yamada|-16|2003-05-01 yamada| 3|2003-05-02 yamada|-23|2003-05-02 honda |-12|2003-05-10 yamada| 12|2003-05-15 yamada| -6|2003-05-20 yamada| -8|2003-06-01 ------------------------------- このレコードで 2003年5月のyamadaさんのレコードの最新日付からの scoreの合計を取得したいと考えています。 ---------------------------------- select name, sum(score) from kekka where name='yamada' and day like '2003-05%' group by name offset 0 limit 4; (このSQLはもちろんうまくいきません) ---------------------------------- <出力したい結果> name | sum(score) --------------------- yamada | -14 です。 SQLがうまくできません。 宜しくお願いいたします。

  • SQL文でのサブクエリの質問です。

    いつもプログラムの質問でお世話になっております。 今回も誠に恐縮ですが今回もご教授いただけたらと思っております。 よろしくお願い致します。 現在、複数条件の絞込み検索のWEBアプリを制作中なのですが MySQLでのSQL文を仮に下記のように入力したら玉田と表示できるようにしたいのですが、何も表示されません。 いろいろ考えたのですが、SQL文の正解がわかりません。 どのように入力したら玉田という名前のみ表示されるのでしょうか? 何卒よろしくお願いします。 SELECT code,name,team_name,price,position,gazou FROM mst_player_market WHERE 1 and (code IN (SELECT playerid FROM team WHERE team_id IN (1))) and (code IN (SELECT name,COUNT(*) FROM mst_player_market GROUP BY name HAVING name = 玉田)); テーブル名 mst_player_market code name price gazou position team_name 15 玉田  70000000 player_bustup_11.jpg FW      名古屋 16 田口  4000000 player_bustup_28.jpg MF      名古屋 17 田鍋  6000000 player_bustup_14.jpg MF      名古屋 18 田中  120000000 player_bustup_04.jpg DF      名古屋 3 津田  40000000 p4389_img2.jpg    FW      徳島  24 長谷川  30000000 p4399_img.jpg       GK      徳島 25 山口  30000000 photo021401851726.jpg MF         千葉 26 ケンペス 50000000 photo011401851481.jpg FW         千葉 テーブル名 team playerid team_id team_name 15 1 名古屋 16 1 名古屋 17 1 名古屋 18 1 名古屋 21 1 名古屋 22 1 名古屋 23 2 徳島 24 2 徳島 25 3 千葉 26 3 千葉 28 2 徳島 29 2 徳島

    • ベストアンサー
    • PHP
  • 2つのSQL文で結果に差違が発生する

    私の知識ではお手上げのため、ご教授願いたいのですが、 下記のようなテーブルが仮にあったとして、レコードがそれぞれいくつか入っています。 【itemsテーブル】   id・・・・・連番   cat_id・・・category.id   price ・・・価格   max_num ・・セット数   date・・・・発売日 【categioryテーブル】   id・・・・・連番   cat_name・・カテゴリ名 【orderテーブル】   id・・・・・連番   item_id ・・items.id   paid_price・支払価格 以下の2つのSQL文を実行させた場合、「total_price」の値に違いは発生しますか? 【SQL文 A】----------------------------- SELECT items.cat_id, `category`.`cat_name`, SUM(`items`.`price` * `items`.`max_num`) AS `total_price`, SUM(IF(`order`.`paid_price` > 0, `order`.`paid_price`, 0)) AS `total_paid`, SUM(IF(`order`.`paid_price` = 0 , `items`.`price`, 0)) AS `not_payment` FROM `items` INNER JOIN `category` ON (`items`.`cat_id` = `category`.`id`) INNER JOIN `order` ON (`items`.`id` = `order`.`item_id`) WHERE DATE_FORMAT(`items`.`date`, '%Y%m') = 201511 GROUP BY `items`.`cat_id` ORDER BY `items`.`cat_id` ASC ------------------------------------ 【SQL文 B】----------------------------- SELECT items.cat_id, `category`.`cat_name`, SUM(`items`.`price` * `items`.`max_num`) AS `total_price` FROM `items` INNER JOIN `category` ON (`items`.`cat_id` = `category`.`id`) WHERE AND DATE_FORMAT(`items`.`date`, '%Y%m') = 201511 GROUP BY `items`.`cat_id` ORDER BY `items`.`cat_id` ASC ------------------------------------ こちらで上記と同じようなSQL文を実行すると、Bで出てほしい値がAでは出てこないのです。 Aの場合は「WHERE DATE_FORMAT(`items`.`date`, '%Y%m') = 201511」が抽出条件として実行されていないような感じです。 すべてのレコードの「SUM(`items`.`price` * `items`.`max_num`) AS `total_price`」が計算されています。 Bだけで実行すればちゃんとほしい値が返ってきます。 何か間違っていますか?

    • ベストアンサー
    • MySQL
  • SQL文の作成苦戦しています。。

    SQL文の作成で困っております。 有識者の方、ご教授願います。 取得したい情報は、以下の通りです。 HOGEテーブル |COL-A|COL-B|COL-C|   111   1   1 … (1)   111   2   1   111   3   2   222   1   2 … (2)   222   2   3 1.Aでグルーピングした中で、COL-Cの最小値を取得 2.#1の中で一番小さい値を取得 ようするに、(1)や(2)のような情報を取得したいのです。 自分自身で作成したSQLは以下のような感じですが、 ちょっと遅いのです。。。 SELECT COL-A, MIN(COL-B), MIN(COL-C) FROM HOGE1, ( SELECT COL-A, MIN(COL-C) AS COL-C FROM HOGE GROUP BY COL-A ) HOGE2 WHERE HOGE1.COL-A = HOGE2.COL-1 AND HOGE1.COL-C = HOGE2.COL-C GROUP BY COL-A 理由はいろいろあります。ですが、最大の理由は、COL-Cの最小値を取得する為に作成しているサブクエリーじゃないかと思っています。そもそも、HOGEテーブル自体、10万件レベルのテーブルを結合して作っているテーブルなので、VIEWを作ってる時点で遅いんです。それに輪をかけて、サブクエリーなんてものを作っているものだから。。。できるだけ、サブクエリーを避けて取得したいのですが、なかなか上手くいきません。ただ、これ以外の方法は存在しない気もします。。 これ以外の方法で、良い方法があればご教授頂きたく。よろしくお願いします。

  • SQL文のEXISTSについて

    DBはmysql5.0を使っています。 以下のSQL文を、EXISTSを境に2つに分解することはできないでしょうか?? SELECT ROUND(SUM(IFNULL(T.DAIKIN,0) - IFNULL(T.TESURYO,0))/10000,1) INTO v_PRICE2 FROM TORIHIKI AS T WHERE T.TORIHIKI_KBN = '1' AND EXISTS (SELECT * FROM TORIHIKI AS T2 WHERE T2.TORIHIKI_DATE >= F_DATE AND T2.TORIHIKI_DATE <= T_DATE AND T2.TORIHIKI_KBN = '2' AND T2.KEHAI_CD = LPAD(v_SOBA_CD,5,'0') AND T2.KAIIN_SBT = v_KAIIN AND T.SEIRI_NO = T2.SEIRI_NO AND ROUND((IFNULL(T2.DAIKIN,0) + IFNULL(T2.TESURYO,0))/10000,1) >= p_MIN AND ROUND((IFNULL(T2.DAIKIN,0) + IFNULL(T2.TESURYO,0))/10000,1) < p_MAX );

  • OraclのSQL文について(No2)

    前回の質問の続きとなります。 Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [NOUKI] と [KIN] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 結果が、 A-1 NAME-1 300 A-2 NAME-2 1200 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? SELECT A.CODE, A.NAME, B.KIN FROM A, B WHERE A.CODE = B.CODE ORDER BY A.CODE と、すると A-1 NAME-1 100 A-1 NAME-1 200 A-2 NAME-2 300 A-2 NAME-2 400 A-2 NAME-2 500 と、言う結果がでます。(当然ですが) しかし、 SELECT A.CODE, A.NAME, A2.KIN FROM A, A2 WHERE A.CODE = A2.CODE GROUP BY A.CODE,A.NAME ORDER BY A.CODE と、すると[GROUP BYの式ではありません]と、エラーになってしまいます。 (SUM文以前の問題でした) よろしくお願い致します。

  • SELECTでgroup byした時の挙動

    環境は PHP5.3.3 MySQL5.0.95 です。 現在TBL1にURL(address)と、そのURLのタイトルタグの中身(title)と、独自に数えてる数字(count)を入れています。 その1つのアドレスに対してcountの数は色々あるので、 そのcountをアドレスと対にして合計したもの(SUM)で並び替えています。 (分かりづらかったらすいません。addressは主キーではないということです。) タイトルに関しては最近取得し始めたところで入ってるところと入っていないところがあります。 その状況下で SELECT address, title, sum(count) as SUM FROM TBL1 where address LIKE "%hoge.com%" group by address order by sum DESC LIMIT 10; こういうSQL文を使ってSELECTした際に、 hoge.com以下の例えばhoge.com/1.html, hoge.com/2.html, ... といった感じのURLごとにSUMの数で並び変わるのですが この場合titleはどのカラムを参照していることになるのですか? (address) (title) (SUM) hoge.com/1.html | test1 | 500 | hoge.com/2.html | test2 | 400 | hoge.com/3.html |    | 300 | hoge.com/4.html | test4 | 200 | hoge.com/5.html | test5 | 100 | hoge.com/6.html |    | 40 | hoge.com/7.html | test7 | 20 | hoge.com/8.html |    | 10 | hoge.com/9.html |    | 6 | hoge.com/10.html |    | 5 | こんな結果だったとして、titleが入っているものと入っていないものの区別がつきません。 入っていないURL(例えばhoge.com/3.html)のaddressカラムも全て空というわけではありません。 逆に入っているものに関しては、全ての行にtitleが入っているわけではありません。 主キーは今回のSELECTとは関係してない"ID"です。 ID | address | count | title 1 | hoge.com/1.html | 3 | test1 2 | hoge.com/1.html | 10 | 3 | hoge.com/1.html | 43 | test1 ID | address | count | title 1 | hoge.com/3.html | 4 | test3 2 | hoge.com/3.html | 3 | 3 | hoge.com/3.html | 42 | それぞれは主キーに応じてcountが個別にある状態です。 上記は正確ではありませんが、こんな感じです。 こうして共に入ったり入ってなかったりするのにSELECTした結果に 入ってるものと入ってないものが出てくるのが分かりません。 ちなみに、検証すると一番countが多い行にtitleが入っていたらSELECT文にも出てくるというわけではないようです。 なぜtitleが出るものと出ないものがあるのでしょう? ご教授宜しく御願い致します。

    • ベストアンサー
    • MySQL
  • VB,SQL文のWHERE句について

    お世話になります。 エクセルVBにて、ACCESSのテーブルのデータを SQL分にてエクセルシートに書き出そうとしているの ですが、WHERE句の記述方法がおかしいのかエラーになっ てしまいます。(下記の「A9999」(データ型はテキスト 型)のところでエラーになります。 どの様な記述をすれば宜しいのでしょうか。 ご教授頂きたくよろしくお願いします。     記 ・記述内容  mySQL = "SELECT 出荷日, 品番, ロケーション, SUM(出荷量) AS 出荷量の合計"  mySQL = mySQL & " FROM 出荷データTMP"  mySQL = mySQL & " WHERE (((ロケーション) <> "A9999"))"  mySQL = mySQL & " GROUP BY 品番, ロケーション, 出荷量;"  Set rs = db.OpenRecordset(mySQL, dbOpenSnapshot)