从临时表返回的MySQL单行

时间:2010-11-15 19:07:49

标签: sql mysql group-by aggregate-functions

我正在针对数据库运行以下查询:

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

是否有人发现导致此问题的问题?

2 个答案:

答案 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
     );

我想你会注意到百分比在类别上是不变的。这可能不是你想要的 - 你可能也希望按类别对错误进行分组。