MySQL: использовать совокупный результат для дальнейшего расчета - PullRequest
0 голосов
/ 11 февраля 2011

В настоящее время я работаю над написанием генераторов отчетов.Для одного отчета мне нужно сделать разбивку по заданному признаку (поставщику, пользователю ведения журнала, языку и т. Д., Который для каждой строки содержит название интересующего меня признака, число элементов, соответствующих этому признаку, и процентное соотношениеиз общего числа элементов, представленных на этом рисунке. Первые два не проблема, третий -.

Например, чтобы получить разбивку по языку, я бы использовал такой запрос.

SELECT lang_id, 
COUNT(IF(open=TRUE,1,NULL)) AS lang_total
FROM table
GROUP BY lang_id;

Это дает мне количество элементов для каждого языка.

Я могу получить общее количество элементов в таблице и достаточно просто сохранить его в переменной с простым счетом.

SELECT @totalOpen:=COUNT(*) FROM table WHERE open = TRUE;

Теперь я хочу добавить третий столбец, который представляет собой число в lang_total, разделенное на значение в @totalOpen, умноженное на 100 (другими словами, процентное соотношение всех элементов, которые соответствуют критериям).следующее:

Это бит, с которым у меня проблемы, потому что, насколько я могу судить, вы не можете использовать статистические столбцы в вычислениях.ЦИИ.

SELECT lang_id, 
COUNT(IF(open=true,1,NULL)) AS lang_total
(lang_total/@totalOpen)*100 as lang_percent
FROM table
GROUP BY lang_id;

Я уверен, что в MySQL должен быть способ сделать это, но я не смог отследить его.Кто-нибудь может помочь с этим?

1 Ответ

1 голос
/ 21 августа 2011

Я читаю этот вопрос сейчас впервые.Я знаю, что, вероятно, уже слишком поздно, чтобы быть полезным для вас, но я бы решил таким образом.

select lang_id, 
sum(if(open= true,1,0)) as lang_total,
coalesce(sum(if(open= true,1,null)) / @r,0) as percentage
from table,(select @r:=count(*) from table where open = TRUE) as t
group by lang_id;
...