MySQL, единственная строка, возвращенная из временной таблицы

0

Я запускаю следующие запросы к базе данных:

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

Кто-нибудь видит проблему с этим, что вызывает проблему?

Теги:
group-by
aggregate-functions

2 ответа

3
Лучший ответ

Стандартный 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 для всей таблицы.

  • 0
    +1 за правильное указание на проблему логики
  • 0
    Хорошо, это имеет полное значение для GROUP BY. Я пытался получить процент ошибок в строке временной таблицы, деленный на общее количество. Хотя вы говорите, что на это нельзя положиться.
Показать ещё 7 комментариев
0

другой способ сделать это - без таблицы 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
     );

Я думаю, вы заметите, что процент не меняется по категориям. Вероятно, это не то, что вы хотите - вы, вероятно, захотите также группировать ошибки по категориям.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню