У меня есть сводный запрос, показанный ниже, получение count и AVG строк, который работает нормально, но не стандартное отклонение, STD.
Как я могу изменить приведенный ниже SQL, чтобы получить STD?
SELECT mid as mID,
round((x.qty_sum / x.qty_count), 5) as qtAVG,
round(x.qty_stddev, 5) as qtSTDDEV,
x.qty_count as qtCOUNT,
round((x.rel_sum / x.rel_count), 5) as relAVG,
round(x.rel_stddev, 5) as relSTDDEV,
x.rel_count as relCOUNT,
FROM (SELECT mid,
SUM(CASE WHEN (mt = "qt") THEN 1 ELSE 0 END) as qty_count,
SUM(CASE WHEN (mt = "qt") THEN rt ELSE 0 END) as qty_sum,
STD(CASE WHEN (mt = "qt") THEN rt ELSE 0 END) as qty_stddev
SUM(CASE WHEN (mt = "rel") THEN 1 ELSE 0 END) as rel_count,
SUM(CASE WHEN (mt = "rel") THEN rel ELSE 0 END) as rel_sum,
STD(CASE WHEN (mt = "rel") THEN rel ELSE 0 END) as rel_stddev
FROM t_r
GROUP BY mid) x;






Похоже, вы пытаетесь перехитрить mysql с помощью этого подзапроса. Что касается опасений, вам не нужен этот дополнительный уровень сложности, просто используйте простой агрегированный запрос с предложением WHERE, которое фильтрует записи, имеющие mt = "qt".
SELECT
mid as mID,
ROUND(AVG(rt), 5) as qtAVG,
ROUND(STD(rt), 5) as qtSTDDEV,
COUNT(*) as qtCOUNT,
FROM t_r
WHERE mt = "qt"
GROUP BY mt
Спасибо за ответ. Я обновил код, чтобы отразить причину, по которой я использую таблицу PIVOT.
Думаю, ваша единственная проблема - это ELSE 0. Вам просто нужны значения NULL, потому что они будут проигнорированы:
SELECT mid as mID,
round((x.qty_sum / x.qty_count), 5) as qtAVG,
round(x.qty_stddev, 5) as qtSTDDEV,
x.qty_count as qtCOUNT,
round((x.rel_sum / x.rel_count), 5) as relAVG,
round(x.rel_stddev, 5) as relSTDDEV,
x.rel_count as relCOUNT,
FROM (SELECT mid,
SUM( mt = 'qt' ) as qty_count,
SUM(CASE WHEN mt = 'qt' THEN rt END) as qty_sum,
STD(CASE WHEN mt = 'qt' THEN rt END) as qty_stddev,
SUM( mt = 'rel' ) as rel_count,
SUM(CASE WHEN mt = 'rel' THEN rel END) as rel_sum,
STD(CASE WHEN mt = 'rel' THEN rel END) as rel_stddev
FROM t_r
GROUP BY mid
) x;
Обратите внимание на некоторые другие изменения:
CASE. При этом используется расширение MySQL, которое обрабатывает логические значения как числа с 1 для истинного и 0 для ложного.ELSE. Функции агрегирования игнорируют значения NULL, поэтому это должно решить вашу проблему.Идеально. Спасибо.
Если вы исправите опечатки (свободная запятая после relcount и пропущенная запятая после qty_stddev), запрос будет работать? Если нет, вы можете исправить вопрос и добавить образцы данных в виде текста к вопросу вместе с ожидаемым результатом.