在选择查询中使用MySQL生成的列

21

我有一个 MySQL 查询,它运行了一个简单的操作(对选择语句中的计数进行求和),我想使用结果进行数学运算,但是出现错误。

表格:

id  |   group   |   count   |
-----------------------------
1       1           3
2       1           2

查询:

select id, count,
  (select sum(count) from table group by group) as total,
  count/total as percent 
from table

这个错误是由于表中没有真实的“总计”列所引起的。我该如何使查询正常工作?


1
您没有提供任何错误信息。 - hakre
1
抱歉!我以为我在最后一段描述清楚了,但是正式的错误是 ERROR 1054 (42S22): Unknown column 'total' in 'field list' - MechEngineer
5个回答

33
你可以将total保存为变量,然后在除法计算中使用它。
SELECT 
  `id`, `count`, 
   @total:=(SELECT sum(`count`) FROM `table` GROUP BY `group`) AS `total`, 
  `count`/@total AS `percent` 
FROM `table`

注意: GROUP 是 MySQL 中的一个保留字,你应该用反引号(`)将它和其他字段/表名一起括起来。


哇,我们有获胜者了!谢谢你,Rocket。 - MechEngineer
12
MySQL文档警告不要这样做。 “通常情况下,除了在SET语句中,您不应该在同一语句中为用户变量赋值并读取该值...您可能会得到您期望的结果,但这并不保证。”请参阅http://dev.mysql.com/doc/refman/5.7/en/user-variables.html - PaulC
PaulC是正确的。执行顺序是未定义的。例如,如果percent先被计算,你将使用上一行的@total - djma

15

你也可以不引入变量来完成这个操作:

select id, 
   count, 
   (select sum(count) from `table` group by `group`) as total, 
   (select count/total) as percent 
from `table`;

产生:

+------+-------+-------+---------+
| id   | count | total | percent |
+------+-------+-------+---------+
|    1 |     3 |     5 |  0.6000 |
|    2 |     2 |     5 |  0.4000 |
+------+-------+-------+---------+
2 rows in set (0.05 sec)

简单而干净的解决方案 - jcrv

2
你的问题在于内部查询需要每行生成一个结果,而不是每个组都生成一个结果。你希望在内部查询中添加一个where子句,像这样说: where inner_table.group = outer_table.group 以便只返回一个结果。

0

group 是 MySQL 中的保留字,table 也是如此,您应该这样使用:

select id, count, (select sum(count) from `table` group by `group`) as total, count/total as percent from `table`

更多信息请参见:MySQL保留字

在那里你会看到实际上可以使用count,但是我仍然建议将所有表名和列名用引号括起来。


0

这个问题在MySql中已经有了答案,但如果有人像我一样错误地来到这里寻找MSSql的解决方案,那么解决方法就像下面这样简单:

select id, count,
  total = (select sum(count) from table group by group),
  count/total as percent 
from table

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接