Я запускаю следующие запросы к базе данных:
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;
Единственная проблема заключается в том, что когда я создаю временную таблицу и делаю выбор * на ней, она возвращает несколько строк, но указанный выше запрос возвращает только одну строку. Кажется, что всегда возвращается одна строка, если я не укажу 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
Сервер: Localhost через сокет UNIX
Кто-нибудь видит проблему с этим, что вызывает проблему?
Стандартный SQL требует, чтобы вы указывали предложение GROUP BY, если какой-либо столбец не был обернут агрегированной функцией (IE: MIN, MAX, COUNT, SUM, AVG и т.д.), но MySQL поддерживает "скрытые столбцы в GROUP BY" - вот почему:
SELECT category,
error_count/SUM(error_count) AS percentage
FROM med_error_third_party_tmp;
... работает без ошибок. Проблема с функциональностью заключается в том, что, поскольку нет GROUP BY, SUM является SUM столбца error_count для всей таблицы. Но другие значения столбца абсолютно произвольны - на них нельзя положиться.
Это:
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 для всей таблицы.
другой способ сделать это - без таблицы temp как отдельный элемент...
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
);
Я думаю, вы заметите, что процент не меняется по категориям. Вероятно, это не то, что вы хотите - вы, вероятно, захотите также группировать ошибки по категориям.