• 締切済み

割合(パーセント)を求めるには?

COUNTによる集計と同時に、パーセンテージを求めたいのですが、どのようにSQLを書けばよいのでしょうか?(MySQL4.1) たとえば、 テーブル名:test、レコード数:100件、カラム数: 2 date product 2014-05-01 メガネ 2014-05-01 鉛筆 2014-05-02 メガネ 2014-05-03 メガネ 2014-05-05 鉛筆 ・・・ ・・ ・ 2014-06-30 鉛筆 ・ ・ という2014年5月1日~6月30日のデータを、 select DATE_FORMAT(date, '%Y-%m'), product, count(product) from test group by product, DATE_FORMAT(date, '%Y-%m'); とすると、以下のようにグループ(月、製品)毎に個数が表示されると思います。 2014-05 メガネ 30 2014-05 鉛筆 20 2014-06 メガネ 15 2014-06 鉛筆 35 それを次のように月別の割合(パーセント)を求めるにはどのようにSQLを書けばよいのでしょうか? 2014-05 メガネ 30 60% 2014-05 鉛筆 20 40% 2014-06 メガネ 15 30% 2014-06 鉛筆 35 70% 一見、インラインビューでできそうだったのですが、月別にする段階でできなくなりました。 (月別にせずデータ全体に対してならインラインビューでパーセンテージが求められると思います。)

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

4.1ならサブクエリが使えるはず 理論の組み立て (1)商品、月別の件数を用意する。(現クエリ) (2)月別の全件数を用意する。 (3)上記の(1)と(2)を日付で結合する。 SELECT A.nengetsu,A.product,CONCAT(A.ken * 100 / B.zen,'%') hi FROM (SELECT DATE_FORMAT(date,'%Y-%m') AS nengetsu,product,COUNT(product) AS ken FROM test GROUP BY product,nengetsu) A INNER JOIN (SELECT DATE_FORMAT(date,'%Y-%m') AS nengetsu,COUNT(product) AS zen FROM test GROUP BY nengetsu) B ON A.nengetsu=B.nengetsu ORDER BY A.nengetsu,A.product

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

パーセント表示するかどうかは置いとくとして、こんな感じで? select ym,p,c,c/(select count(product) from test where DATE_FORMAT(date, '%Y-%m')=ym) as ratio from (select DATE_FORMAT(date, '%Y-%m') as ym, product as p, count(product) as c from test group by p, ym) as t1

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 割合(パーセント)を求めるにはどのようにSQLを書けばよいのでしょうか?

    SQLで グループ毎にカウントした数でなくて割合を求めたいのです。 select name, count(*) from データベース名 group by name order by 2 desc; とすると、以下のように200件あるデータで グループ(名前)毎に個数が表示されますが、 田中 70 上村 120 橘川 10 下のように割合(パーセント)を求めるにはどのようにSQLを書けばよいのでしょうか? 田中 70 35% 上村 120 60% 橘川 10 5%

    • ベストアンサー
    • MySQL
  • countで0を返せますか?

    PHP,Mysql5です。 IFNULL関数で実現できそうなことがわかり以下のようなソースで 試してみたのですが0ではなくnullが返ってきてしまいます・・・ $where_sql = join(' || ' , $where); //$where_sqlの中身 DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-01' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-02' || 中略・・・ DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-30' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-31' $sql = "SELECT create_date, IFNULL(Count(order_id), 0) as cnt FROM products_order_detail WHERE {$where_sql} GROUP BY order_id"; 例えば以下のような構成だとします。 2009-03-05のデータが1件存在 2009-03-12のデータが2件存在 2009-03-24のデータが1件存在 現状の結果は以下の通りです。 Array ( [0] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) [1] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) [2] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 当然の結果なのですがこのように存在する分のデータのみが返って きます。希望としての結果の配列は以下のような感じで Array ( [0] => Array ( [create_date] => 2009-03-01 [cnt] => 0 ) 中略・・・ [4] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) 中略・・・ [11] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) 中略・・・ [23] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 中略・・・ [30] => Array ( [create_date] => 2009-03-31 [cnt] => 0 ) のように比較する日付のデータがあればカウントしなければcntに nullではなく0を入れたいのですがどうすればいいでしょうか? もしくはPHPにて処理するべき事なのか方法が思いつきません。

    • 締切済み
    • PHP
  • 月間集計ですべての日付を抽出するには

    Oracle9iで開発をしております。 月間集計をするにあたり、SQLをどのように書けばよいのか質問させていただきたいと思います。 たとえば、COUNTテーブルというテーブルがあり 年月日 カウント数 2005/09/01 1000 2005/09/01 1000 2005/09/02 2000 2005/09/03 3000 2005/09/05 5000 2005/09/06 6000 というようにデータが入っていたとします。 現在、 SELECT 年月日, SUM(カウント数) FROM COUNTテーブル WHERE COUNT_DATE BETWEEN TO_DATE(to_char(?||'/'||?||'/01')) AND LAST_DAY(TO_DATE(to_char(?||'/'||?||'/01'))) GROUP BY 年月日 としていまして、抽出されるデータは 2005/09/01 2000 2005/09/02 2000 2005/09/03 3000 2005/09/05 5000 2005/09/06 6000 となります。 ここで、2004/09/04や2005/09/07以降2005/09/30までのテーブルには存在 しない日付も抽出したいと思っています。 どのようにすれば抽出できるのでしょうか?

  • このぐるぐるSQLクエリまとまりますか?

    ピボット集計の理解が難しくて難儀してます このような予定表を作るのですが毎月ごとに集計してやるのに 4回問い合わせております。一回でえいやっと投げるにはどう記述しましょう? mysql 5.0です -- 今月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') group by 商品番号; -- 来月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 1 MONTH, '%Y%m') group by 商品番号; -- 再来月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 2 MONTH, '%Y%m') group by 商品番号; -- ささらい月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 3 MONTH, '%Y%m') group by 商品番号;

  • group by したものをsumしたのですが方法がわかりません。

    ある情報をgroup byしその数をcountし、そのcountした数をsumしたのですがどのようにすればよろしいでしょうか? 例えば DB名 test a | ------ ABA | A | AA | ABA | select a,count(*) count from test group by a; a |count| ------------- ABA | 2 | A | 1 | AA | 1 | このカウントの数字を一回でsumすることは可能でしょうか? 宜しくお願いします。

  • 集計について

    TABLE "acces" cd(int)auto_increment usercd(int) accesday(datetime) があり、その中から DATE_FORMAT(vEntryDate,'%Y-%m-%d') = 'yyyy-mm-dd'; という条件にマッチするusercdの数を取得したいのですがどうしたらよいのでしょうか? 結果として usercd count a 100 b 200 というように日付ごとに検索をかけたいと思っています。 よろしくお願いします。

  • 集計関数の合計について

    お世話になります。 SQLSever2005を使用しています。 Count(*)で月毎のデータ件数を集計し、またその結果を出力するSQLを考えております。 SELECT  (SELECT Count(*) FROM TBL_TEST T1 WHERE T1.T_DATE>='2005/01/01' AND T1.T_DATE=<'2005/01/31') AS CNT_1,  (SELECT Count(*) FROM TBL_TEST T2 WHERE T2.T_DATE>='2005/02/01' AND T2.T_DATE=<'2005/02/31') AS CNT_2,   (SELECT Count(*) FROM TBL_TEST T3 WHERE T3.T_DATE>='2005/03/01' AND T3.T_DATE=<'2005/03/31') AS CNT_3,   (CNT_1+CNT_2+CNT_3) AS TOTAL_CNT ・・・・・・・・・・・・ (★)  FROM TBL_TEST T  WHERE ・・・・・・・・・ 結果(★)のところで『CNT_1は無効です』というエラーになってしまいます。 ちなみにAccessではエラーにならずに結果を出力していました。 上記のSQL文はどのように修正すればよろしいでしょうか?

  • 一部データを除外するSQL

    SQL(MySQL)についての質問です。 顧客データの中からある月の誕生日のデータを抽出しようと考えています。 6月生まれだったら、 SELECT * FROM customer WHERE DATE_FORMAT(birthday, '%m')= 6; 12月生まれだったら SELECT * FROM customer WHERE DATE_FORMAT(birthday, '%m')= 12; でできるんですが、実は顧客データの中には誕生日がわからない人がいて、 その場合「1900-01-01」をセットしています。 ですので、1月生まれを指定する SELECT * FROM customer WHERE DATE_FORMAT(birthday, '%m')= 1; とすると誕生日が「1900-01-01」の人も含まれてしまいます。 誕生日「1900-01-01」のデータを排除するSQLがわからなくて困っています。 NOT IN とか EXCEPT とか使ってみたんですがうまくいきませんでした。 どなたか教えて頂けると大変うれしいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • ORACLE のSQL について

    おはようございます。 ORACLEのSQLについて教えてください。 GROUP BY で抽出されたデータの レコード数を把握するSQLはどのようにすればよいのでようか。 ********************** 例: SQL: SELECT TEST_CD FROM TABLE GROUP BY TEST_CD 結果: 01 02 03 04 05 ********************** この結果のレコード(5レコード)のSQL式はどのようになりますか?

機械に関する質問
このQ&Aのポイント
  • 電気代を削減できる機械について紹介を受けましたが、電力ロスを考える必要があります
  • GHという機械は電力ロスを使用可能電力に変換することで電気代を削減することができます
  • しかし、電力ロスを使用可能電力に変えても消費されるため、追加の発電が必要になります
回答を見る