我有一个运行简短操作的MySQL查询(总计select语句中的计数),我想使用结果进行数学运算,但是我收到了一个错误。
表:
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
错误是因为表中没有真正的“总”列。如何使查询起作用?
答案 0 :(得分:22)
您可以将total
保存为variable,然后在除法计算中使用它。
SELECT
`id`, `count`,
@total:=(SELECT sum(`count`) FROM `table` GROUP BY `group`) AS `total`,
`count`/@total AS `percent`
FROM `table`
注意:GROUP
是MySQL中的reserved word。你应将它(以及所有其他字段/表名)括在反引号(`)中。
答案 1 :(得分:6)
您也可以在不引入变量的情况下执行此操作:
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)
答案 2 :(得分:1)
您的问题是内部查询需要每行生成1个结果,而不是每个组生成1个结果。您想在内部查询中添加where子句,如
where inner_table.group = outer_table.group
这样只返回一个结果。
答案 3 :(得分:0)
group
是mysql中的保留字,table
也是如此,您应该像以下一样使用它:
select id, count, (select sum(count) from `table` group by `group`) as total, count/total as percent from `table`
有关详细信息:MySQL Reserved Words
你会看到你实际上可以使用count
,但无论如何我会把所有的表名和列名都放在引号中。
答案 4 :(得分:0)
这个问题已经有了MySql的答案,但是如果有人像我一样在这里登陆MSSql,那是错误的,就像下面对于MSSql一样简单
select id, count,
total = (select sum(count) from table group by group),
count/total as percent
from table