MySQL, единственная строка, возвращенная из временной таблицы - PullRequest
0 голосов
/ 15 ноября 2010

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

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

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

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

Стандартный 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 является суммой столбца 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 голосов
/ 15 ноября 2010

другой способ сделать это - без временной таблицы как отдельного элемента ...

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

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

...