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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

6回答

308閲覧

CASE文とGROP BYの併用

Chandler_Bing

総合スコア673

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

0クリップ

投稿2019/02/15 14:10

編集2019/02/21 06:52

現在のコードとエラーです

SQL

1SELECT hotel_id, AVG(rating) AS rate, 2CASE WHEN rate > 4.5 THEN '非常に良い' 3 WHEN rate > 3 THEN '普通' 4 WHEN rate <= 3 THEN '平均未満' 5 ELSE rate'評価なし' 6 END AS 'ratingresult' 7FROM hotels_reviews GROUP BY hotel_id

これを実行すると

error

1#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''評価なし' 2 END AS 'ratingresult' 3FROM hotels_reviews GROUP BY hotel_i' at line 5

となります。どこが間違えておりますでしょうか。
追記。以下がテーブルです。

SQL

1-- phpMyAdmin SQL Dump 2-- version 4.8.3 3-- https://www.phpmyadmin.net/ 4-- 5-- Host: localhost:8889 6-- Generation Time: Feb 21, 2019 at 06:49 AM 7-- Server version: 5.7.23 8-- PHP Version: 7.2.8 9 10SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 11SET time_zone = "+00:00"; 12 13-- 14-- Database: `BookingSite` 15-- 16 17-- -------------------------------------------------------- 18 19-- 20-- Table structure for table `hotels_reviews` 21-- 22 23CREATE TABLE `hotels_reviews` ( 24 `hotels_reviews_id` int(11) NOT NULL, 25 `hotel_id` int(11) NOT NULL, 26 `country_code` enum('JPN','PHL') DEFAULT NULL, 27 `user_name` varchar(100) NOT NULL, 28 `user_country` enum('JPN','PHL') DEFAULT NULL, 29 `content` text NOT NULL, 30 `length` int(11) NOT NULL, 31 `rating` enum('1','2','3','4','5') DEFAULT NULL 32) ENGINE=InnoDB DEFAULT CHARSET=utf8; 33 34-- 35-- Dumping data for table `hotels_reviews` 36-- 37 38INSERT INTO `hotels_reviews` (`hotels_reviews_id`, `hotel_id`, `country_code`, `user_name`, `user_country`, `content`, `length`, `rating`) VALUES 39(7, 3, 'PHL', 'Chandler', 'PHL', 'This is by far the best stay that I have ever had. People are very nice Which if there is next time,\r\nmakes me want to book the hoel again.This is by far the best stay that I have ever had. People are very nice Which if there is next time,\r\nmakes me want to book the hoel again.', 3, '5'), 40(8, 3, 'PHL', 'ハマショー', 'JPN', 'This is by far the best stay that I have ever had. People are very nice Which if there is next time,\r\nmakes me want to book the hoel again.This is by far the best stay that I have ever had. People are very nice Which if there is next time,\r\nmakes me want to book the hoel again.', 4, '5'), 41(9, 3, 'PHL', 'YutaNakai', 'JPN', 'とても素晴らしい滞在でした。皆さんとても親切でまた行きたと思いました。他の方にも体験して欲しいです。とても素晴らしい滞在でした。皆さんとても親切でまた行きたと思いました。他の方にも体験して欲しいです。\r\nとても素晴らしい滞在でした。皆さんとても親切でまた行きたと思いました。他の方にも体験して欲しいです。', 8, '5'), 42(14, 3, 'PHL', 'Joye', 'JPN', 'Everything was so good that there is nothing that I can complain about even if I had to. Especially, one of the receptionist was amazing.\r\nThe way she takes care of customer,she speaks and stuff.Thank you for delightful stay.Everything was so good that there is nothing that I can complain about even if I had to. Especially, one of the receptionist was amazing.\r\nThe way she takes care of customer,she speaks and stuff.Thank you for delightful stay.', 2, '5'), 43(15, 3, 'PHL', '井上', 'JPN', 'とても素晴らしかったです。また行きます!', 2, '5'), 44(16, 3, 'PHL', 'ChinMu', 'PHL', 'Everything was good but the fact that they gave us the uncorrect key twice.', 3, '4'), 45(17, 1, 'PHL', 'みっちー', 'JPN', '普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。\r\n普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。', 2, '3'), 46(18, 1, 'PHL', 'NOHARA', 'JPN', '普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。\r\n普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。', 2, '3'), 47(19, 1, 'PHL', 'Monica', 'PHL', 'That was too dirty although cheap.......', 2, '2'), 48(20, 2, 'PHL', 'Monica', 'PHL', 'Nothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. I can go there again.', 1, '4'), 49(21, 2, 'PHL', 'Narita', 'JPN', '普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。\r\n普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。普通です。', 2, '4'), 50(22, 2, 'PHL', 'shinohara', 'JPN', '特にこれといって悪いところはなかったので、次も利用したいと思います。', 3, '4'), 51(23, 2, 'PHL', 'Ross', 'PHL', 'Nothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. \r\nI can go there again.Nothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. I can go there again.\r\nNothing so bad so that was okay. I can go there again.Nothing so bad so that was okay. I can go there again.', 2, '4'), 52(24, 2, 'PHL', 'Tom', 'PHL', 'Normal......................', 5, '3'); 53 54-- 55-- Indexes for dumped tables 56-- 57 58-- 59-- Indexes for table `hotels_reviews` 60-- 61ALTER TABLE `hotels_reviews` 62 ADD PRIMARY KEY (`hotels_reviews_id`), 63 ADD UNIQUE KEY `hotel_id` (`hotel_id`,`country_code`,`user_name`); 64 65-- 66-- AUTO_INCREMENT for dumped tables 67-- 68 69-- 70-- AUTO_INCREMENT for table `hotels_reviews` 71-- 72ALTER TABLE `hotels_reviews` 73 MODIFY `hotels_reviews_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=25; 74
bochan2👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/15 21:17

何を目的としたコードなのか書かないと的確な回答は得られません。 で、いつになったらエラー読むの?
m.ts10806

2019/02/21 06:54

別の回答に書きましたよね。 https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5 これ読んで理解して実践できるようになるまで質問しないくらいの気持ちでやってくれって。 何度も言ってます。 プログラムは書いた通りに動くもの。あなたは「どこが間違えてる?」と言えるほど思うように動かせる実力は皆無です。 基礎の基礎の基礎からやり直してください。
m.ts10806

2019/02/21 06:55

「まだ回答を求めています」と書いている割に何も自分でやってないので何も進んでません。 依頼する前にやることがあるでしょう。
guest

回答6

0

つELSE rate '評価なし' → ELSE '評価なし'

投稿2019/02/15 23:01

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2019/02/16 11:54

ありがとうございます。 SELECT hotel_id, AVG(rating) AS rate, CASE WHEN rate > 4.5 THEN '非常に良い' WHEN rate > 3 THEN '普通' WHEN rate <= 3 THEN '平均未満' ELSE '評価なし' END AS 'ratingresult' FROM hotels_reviews GROUP BY hotel_id としましたが、同じでした。
guest

0

sql

1SELECT hotel_id, AVG(rating) AS rate, 2CASE WHEN AVG(rating) > 4.5 THEN '非常に良い' 3 WHEN AVG(rating) > 3 THEN '普通' 4 WHEN AVG(rating) <= 3 THEN '平均未満' 5 ELSE '評価なし' 6 END AS 'ratingresult' 7FROM hotels_reviews GROUP BY hotel_id

としたら動きました。

動作サンプル

投稿2019/02/21 07:23

alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2019/02/21 08:13

ありがとうございます。 2 errors were found during analysis. Unrecognized keyword. (near "AS" at position 185) Unexpected token. (near "'ratingresult'" at position 188) のエラーが返されます。
alg

2019/02/21 08:26

まったく同じSQL文を実行した結果、ある環境では正常に動作し、別の環境ではエラーになる、ということになりますね。そうすると考えられる原因は大きく2つに分けられます。(1)環境によって発生するエラー (2)実は同じSQL文になっていない
alg

2019/02/21 08:28

(1)については可能な範囲で合わせたつもりですが、何か違いがあるのかもしれません。MySQLのバージョンとか?エンコードとか?そのあたりを確認していただくとよいかもしれません。
alg

2019/02/21 08:29

(2)についても一応確認していただいたほうがよさそうです。例えば、実は全角スペースが入っているとか。
guest

0

ベストアンサー

SQL

1select * 2 , CASE WHEN rate > 4.5 THEN '非常に良い' 3 WHEN rate > 3 THEN '普通' 4 WHEN rate <= 3 THEN '平均未満' 5 ELSE '評価なし' 6 END AS ratingresult 7from ( 8 SELECT hotel_id, AVG(rating) AS rate 9 FROM hotels_reviews 10 GROUP BY hotel_id 11) step1

試してないけど、こっちでもいけるかも

SQL

1SELECT hotel_id, AVG(rating) AS rate 2 , CASE WHEN AVG(rating) > 4.5 THEN '非常に良い' 3 WHEN AVG(rating) > 3 THEN '普通' 4 WHEN AVG(rating) <= 3 THEN '平均未満' 5 ELSE '評価なし' 6 END AS ratingresult 7FROM hotels_reviews 8GROUP BY hotel_id

投稿2019/02/21 08:25

編集2019/02/21 08:28
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2019/02/22 13:20

上手く行きました。ありがとうございます。
guest

0

動かしてはいませんが、

sql

1END AS 'ratingresult'

sql

1END AS ratingrsult

にすればいけませんか?シングルクォートで囲む必要無いように思います。

投稿2019/02/19 04:51

backyard

総合スコア534

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2019/02/19 05:25

それも試したのですが、エラーが出ます。同じエラーです。
guest

0

SQL

1END AS 'result' 23END AS result

投稿2019/02/15 14:18

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2019/02/15 14:24

回答ありがとうございます。’’を外しましたが全く同じエラーが出ます。 全ての''を外してみたりもしましたが、同じです。
Orlofsky

2019/02/15 23:03

CASE の前に , が抜けています。
Chandler_Bing

2019/02/17 15:58

SELECT hotel_id, AVG(rating) AS rate, CASE WHEN rate > 4.5 THEN '非常に良い' WHEN rate > 3 THEN '普通' WHEN rate <= 3 THEN '平均未満' ELSE '評価なし' END AS 'ratingresult' FROM hotels_reviews GROUP BY hotel_id としましたが、同じでした。
Orlofsky

2019/02/19 13:20

'ratingresult' とシングルクォートで囲むのは止めてください。シングルクォートで囲むとSQLでは文字列とみなすので、別名がないのでエラーになります。 質問にCREATE TABLEも追記してください。
guest

0

エラーに書かれている通りです。

'result' ←ここ

ついでだけど、このCASE文では、絶対に『普通』は出ないな。

投稿2019/02/15 14:13

編集2019/02/15 14:47
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2019/02/15 15:07

当符号間違えてました。修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問