[MySQL]FROM句のサブクエリ
レジのデータテーブルから、データを取得する。
table :register columns:register_id, waiting, ...
レジ待ちしている人数毎のレジ数を一覧する。
> select waiting, count(*) as cnt from register group by waiting; +---------+-----+ | waiting | cnt | +---------+-----+ | 0 | 334 | -> 待ち人数なし | 1 | 109 | -> 待ち人数1のレジが109個 | 2 | 73 | -> : | 3 | 31 | | 4 | 9 | | 5 | 11 | | 6 | 3 | | 7 | 3 | | 9 | 2 | -> : | 12 | 1 | -> 待ち人数12のレジが1個 +---------+-----+
レジ待ち人数の総計を計算する1
> select waiting, count(*) as cnt, waiting * cnt from register group by waiting; ERROR 1054 (42S22): Unknown column 'cnt' in 'field list'
waiting と cnt を掛けたいのだが、cnt は認識されない。
レジ待ち人数の総計を計算する2
> SELECT waiting * cnt from (select waiting, count(*) as cnt from register group by waiting); ERROR 1248 (42000): Every derived table must have its own alias
FROM句のサブクエリを使用したが、エイリアスが必要と言われる。
レジ待ち人数の総計を計算する3
> SELECT waiting * cnt from (select waiting, count(*) as cnt from register group by waiting) as t; +---------------+ | waiting * cnt | +---------------+ | 0 | | 109 | | 146 | | 93 | | 36 | | 55 | | 18 | | 21 | | 18 | | 12 | +---------------+
エイリアス(as t)を追加することで、cnt を使用した計算が可能となった。
レジ待ち人数の総計を計算する4
> SELECT sum(waiting * cnt) as sum from (select waiting, count(*) as cnt from register group by waiting) as t; +-----+ | sum | +-----+ | 508 | +-----+
sum() で総計を表示する。
追記:
上記「レジ待ち人数の総計を計算する3」は単純に以下でもできた。
> select waiting * count(*) as cnt from register group by waiting; +-----+ | cnt | +-----+ | 0 | | 109 | | 146 | | 93 | | 36 | | 55 | | 18 | | 21 | | 18 | | 12 | +-----+