質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

MySQLでCASE式でカウントできない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,590

yotsuba

score 16

Windows版のMySQL5.0.96を使っています。

指定したデータの件数をカウントしようと、テーブル内のCategoryの「野菜」「果物」
を指定しましたがカウントできませんでした。
原因はなにが考えられるでしょうか?

■total テーブル(※修正1)
+------+----------+------------+-------+-------+
| code | category | name       | price | sales |
+------+----------+------------+-------+-------+
| 1001 | 果物     | りんご     |   300 |  4800 |
| 1002 | 果物     | オレンジ   |   150 |  4950 |
| 1003 | 果物     | バナナ     |   420 |  2100 |
| 1004 | 果物     | イチゴ     |   880 |  7920 |
| 1005 | 果物     | 桃         |   620 |  2480 |
| 1006 | 野菜     | ピーマン   |   245 |  6615 |
| 1007 | 野菜     | 人参       |   198 |  3762 |
| 1008 | 野菜     | ほうれん草 |    98 |  2058 |
+------+----------+------------+-------+-------+

■実行したSQL文(※修正2-太線部分)
select count(category) as "総数",
 sum( case category when '果物' then 1 else 0 end ) as "果物の数" ,
  sum( case category when '野菜' then 1 else 0 end ) as "野菜の数"
  from total;

■実行結果
+------+----------+----------+
| 総数 | 果物の数 | 野菜の数 |
+------+----------+----------+
|    8 |        0 |        0 |
+------+----------+----------+

■列の構造
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| code     | char(4)     | YES  |     | NULL    |       |
| category | varchar(20) | YES  |     | NULL    |       |
| name     | varchar(30) | YES  |     | NULL    |       |
| price    | int(11)     | YES  |     | NULL    |       |
| sales    | int(11)     | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

ああ、whenって書いてましたね。
select count(category) as "総数",
( select count(*) from total where category = '果物' ) as "果物の数" ,
( select count(*) from total where category = '野菜' ) as "野菜の数"
from total;
コードはこちらが正しいです。mysql5.6では動作確認しましたが5.0で動作するかは未知数

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/21 20:23 編集

    間違って新規投稿してしまいました.... 消せないのかな。
    また2ptついてるし。この辺ちょっと欠陥っぽい。

    キャンセル

  • 2016/03/21 20:32

    hirohiroさん

    結果が正しく表示できました!
    mysql> select count(category) as "総数",
    -> ( select count(*) from total where category = '果物' ) as "果物の数" ,
    -> ( select count(*) from total where category = '野菜' ) as "野菜の数"
    -> from total;
    +------+----------+----------+
    | 総数 | 果物の数 | 野菜の数 |
    +------+----------+----------+
    | 8 | 5 | 3 |
    +------+----------+----------+
    1 row in set (0.06 sec)

    こちらのほうがすっきりしていいですね。
    countの使い方をもっと勉強します。
    ありがとうございました!

    キャンセル

  • 2016/03/21 20:41 編集

    ああ、もしヘビーに使うならちゃんとコスト計測したほうがいいと思いますよ。
    こっちのコードは副問い合わせ含めて3回SQLを投げ、もう一方はDBへの問い合わせは1回ですがCASEでの振り分けを行います。(実際のところオプティマイザの性能次第ですが、昔のmysqlは頭悪いと評判だったように思います)
    データ件数が数十万件、毎分何回アクセスとかにならないならどっちでも問題無いとは重いますが....感覚的はCASEを使うほうが軽いような気はします。

    キャンセル

  • 2016/03/22 23:34

    まだ勉強始めたばかりなので、コスト計測(パフォーマンス?)などはよくわかっていませんが、今後の課題にしたいと思います。
    いろいろ教えて頂きありがとうございました。

    キャンセル

-1

category登録名が'果物'や'果物'ではなく、'  果物'だったなどでしょうか?
固定長のカラムでも問題は起きないみたいなので、データ入力時にわざと前方に空白を入れていないと再現しないと思います。:参考

他にはSQL実行エディタとテーブルの文字コードが異なっていた等

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/21 20:22 編集

    試しに、記述を変えてみたところ、結果が表示されるようになりました。
    (case category when のところ)

    mysql> SELECT COUNT(category) AS "総数",
    -> SUM( CASE
    -> WHEN category = '果物' THEN 1
    -> ELSE 0
    -> END ) AS "果物の数",
    -> SUM( CASE
    -> WHEN category = '野菜' THEN 1
    -> ELSE 0
    -> END ) AS "野菜の数"
    -> FROM total;
    +------+----------+----------+
    | 総数 | 果物の数 | 野菜の数 |
    +------+----------+----------+
    | 8 | 5 | 3 |
    +------+----------+----------+
    1 row in set (0.00 sec)

    hirohiroさんのご指摘の通り、
     sum(case category ~ 
    の記述だとダメなのかもしれません。

    キャンセル

  • 2016/03/21 20:26

    動作したようでよかったです。
    2008年付けのmysql5.1の新機能!みたいな記事があったので
    5.0は相当古いみたいですね。最新バージョンとはお作法の違う部分がいろいろあるのだと思います。

    キャンセル

  • 2016/03/22 23:32

    参考にしているテキストに載っているコマンド/関数が使えないとこまるので、
    MySQL 5.5.47 へバージョンアップしました。
    最初に載せたSQL文でも動作するようになりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る