我正在针对数据库运行以下查询:
CREATE TEMPORARY TABLE med_error_third_party_tmp
SELECT `med_error_category`.description AS category, `med_error_third_party_category`.error_count AS error_count
FROM
`med_error_category` INNER JOIN `med_error_third_party_category` ON med_error_category.`id` = `med_error_third_party_category`.`category`
WHERE
year = 2003
GROUP BY `med_error_category`.id;
唯一的问题是,当我创建临时表并对其执行select *时,它会返回多行,但上面的查询只返回一行。它似乎总是返回一行,除非我指定GROUP BY,但它返回的百分比为1.0,就像应该使用GROUP BY一样。
SELECT category,
error_count/SUM(error_count) AS percentage
FROM med_error_third_party_tmp;
以下是服务器规格:
服务器版本:5.0.77
协议版本:10
服务器:通过UNIX套接字的Localhost
是否有人发现导致此问题的问题?
答案 0 :(得分:3)
标准SQL要求您指定GROUP BY子句,如果任何列未包含在聚合函数中(IE:MIN,MAX,COUNT,SUM,AVG等),而MySQL supports "hidden columns in the GROUP BY" - 这就是为什么:
SELECT category,
error_count/SUM(error_count) AS percentage
FROM med_error_third_party_tmp;
...运行没有错误。该功能的问题在于,因为没有GROUP BY,所以SUM是整个表的error_count列的SUM。但其他列值完全是任意的 - 它们不能被依赖。
此:
SELECT category,
error_count/(SELECT SUM(error_count)
FROM med_error_third_party_tmp) AS percentage
FROM med_error_third_party_tmp;
...会在每行的基础上给出一个百分比 - 类别值将重复,因为没有分组。
此:
SELECT category,
SUM(error_count)/x.total AS percentage
FROM med_error_third_party_tmp
JOIN (SELECT SUM(error_count) AS total
FROM med_error_third_party_tmp) x
GROUP BY category
...将给出每个类别的百分比error_count值与整个表的error_count值之和的每个类别的百分比。
答案 1 :(得分:0)
另一种方法 - 没有将临时表作为单独的项目......
select category, error_count/sum(error_count) "Percentage"
from (SELECT mec.description category
, metpc.error_count
FROM med_error_category mec
, med_error_third_party_category metpc
WHERE mec.id = metpc.category
AND year = 2003
GROUP BY mec.id
);
我想你会注意到百分比在类别上是不变的。这可能不是你想要的 - 你可能也希望按类别对错误进行分组。