MySQLで、複数のカラム値の計算結果をASで新しいカラム名で出力し、新しいカラム名で抽出を行った時にレコード数をカウントする方法を知りたいです。
WHERE句ではエラーになるのでHAVING句を使うということまではわかったのですが、結果の総レコード数を出力することができません。
テーブル名:s
id | a | b
1 | 100 | 200
2 | 200 | 80
3 | 300 | 20
4 | 400 | 90
5 | 500 | 40
下記のような手順を踏んでみました。
まず、WHERE句で全件を出力
SELECT count(id) FROM s WHERE 1
[結果]
count(id)
5
ASを使わない aカラムで抽出
SELECT count(id) FROM s WHERE 1 AND a BETWEEN 200 AND 400
[結果]
count(id)
3
AS を使って (a/b)*100 を計算したカラム c を作成
SELECT id,a,b,(a/b)*100 as c FROM s WHERE 1 AND a BETWEEN 200 AND 400
idが2,3,4の3件分のデータが表示される
id | a | b | c
2 | 200 | 80 | 250.0000
3 | 300 | 20 |1500.0000
4 | 400 | 90 | 444.4444
cカラム(計算した結果)でBETWEENを実行
SELECT id,a,b,(a/b)*100 as c FROM s WHERE 1 AND c BETWEEN 200 AND 500
エラーになる
#1054 - Unknown column 'c' in 'where clause'
ASを使った時に Where句では c を指定できないのでHAVING句を使うということを知り、WHERE句をHAVING句に書き換える。
SELECT id,a,b,(a/b)*100 as c FROM s HAVING 1 AND c BETWEEN 200 AND 500
id | a | b
1 | 100 | 200 |333.3333
2 | 200 | 80 |250.0000
4 | 400 | 90 |444.4444
この結果のレコード数をcountで取得したいです。
SELECT count(*),id,a,b,(a/b)*100 as c FROM s HAVING 1 AND c BETWEEN 200 AND 500
SELECT count(id),id,a,b,(a/b)*100 as c FROM s HAVING 1 AND c BETWEEN 200 AND 500
これだと結果が5件になってしまいます。
idでグループ化すれば良いと思い
SELECT count(id),id,a,b,(a/b)*100 as c FROM s GROUP BY id HAVING 1 AND c BETWEEN 200 AND 500
を実行
count(id) | id | a | b | c
1 | 1 | 100 | 30 | 333.333333300
1 | 2 | 200 | 80 | 250.000000000
1 | 4 | 300 | 90 | 444.444444400
HAVINGとGROUPを使っているので、このように3行の結果が出るのは当然だと思うのですが、この時の結果を「SELECT count(*) FROM WHERE 1」の時と同じように
count(id)
3
という合計値だけ出力するようにしたいです。
ご回答よろしくお願い致します。
~~~~~~~~~~~~~~~~~~
テストデータ
~~~~~~~~~~~~~~~~~~
CREATE TABLE `s` (
`id` int(11) NOT NULL,
`a` int(3) NOT NULL,
`b` int(3) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
INSERT INTO `s` (`id`, `a`, `b`) VALUES
(1, 100, 30),
(2, 200, 80),
(3, 300, 20),
(4, 400, 90),
(5, 500, 40);
ALTER TABLE `s`
ADD PRIMARY KEY (`id`);
ALTER TABLE `s`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=6;
No.1ベストアンサー
- 回答日時:
havingの使い方がおかしい
SELECT count(id) FROM s where 1 AND (a/b)*100 BETWEEN 200 AND 500
yambejpさま
ご回答ありがとうございました。
教えていただいたSQL文で総数が取得できました。
計算後のカラムでソートを使いたかったので教えていただいたSQL文を
SELECT id,(a/b)*100 as c FROM s where 1 AND (a/b)*100 BETWEEN 200 AND 500 ORDER BY c ASC
というようにしましたらデータの抽出とソートもうまくいきました。
where句の中で c が使えないので、 (a/b)*100 という計算式を直接指定すればよかったのですね。having句の中では asで指定したカラム名を使えるという情報があったので、Whereと同じような使い方ができるのかもしれないと思ったのですが、ダメなんですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイクラPC版のコマンドで効率...
-
エクセルで最後の文字だけ置き...
-
阪急三番街 ATM(ゆうちょ)は...
-
同一のユーザー、同一商品のと...
-
Unionした最後にGROUP BYを追加...
-
DataTableで重複行を削除したい
-
書籍の内容はまともでしょうか?
-
副問合せの書き方について
-
SQL Left Join で重複を排除す...
-
WHERE id = ? について
-
min句のSQLを改造し二番目に小...
-
MySQLのint型で001と表示する方...
-
別テーブルからSELECTした値を...
-
所有格の意味
-
select文のwhere句に配列を入れ...
-
スクリーンセイバー
-
MySQLの抽出について
-
ポスグレでの幾何学データ配列...
-
AUTO_INCREMENTのあるテーブル...
-
【MySQL】本当に困っているので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報