2013-12-17 3 views
0

Итак, вот моя ситуация. У меня есть 1 запрос, который получает результаты, сгруппированные по дате, тогда я объединяю весь второй запрос, который получает итоговые значения (без группировки по дате). Моя проблема заключается в том, что я вычисляю среднее значение полей, и когда я хочу суммировать средний, мои номера не складываются.Получение полного использования Союза Все

Вот мой SQLFiddle

Вот мой запрос:

SELECT 
    t.end, 
    SUM(CASE WHEN (t.start != t.end) THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1 END)/COUNT(t.id) as averageTime 
FROM store t 
GROUP BY t.end 
UNION ALL 
SELECT 
    'Total', 
    SUM(CASE WHEN (t.start != t.end) THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1 END) as averageTime 
FROM store t 

Сейчас второй запрос просто дает общее не общее от среднего. Любая помощь приветствуется, спасибо.

Для уточнения, так как существует некоторая путаница ...

мне нужно получить среднее за сгруппированных дату, на сколько пунктов были в этой группе

TimeDiff/кол (t.id)

Поскольку я не группирую в объединении все запросы, он делает это в целом, а затем деля. Надеюсь, это имеет смысл.

Первый запрос является правильным вывода данных выглядит следующим образом:

1, 1,6667, 3 (Те значения averageTime из первого запроса) 5,6667 (Должен быть общий ряд) Сейчас у меня есть его из 10, что является суммой, прежде чем первые ряды были усреднены.

+0

Почему вы не используете функцию avg, а затем суммируете их? –

+0

Я в замешательстве, вы хотите «СУММ» из средних значений (используйте «AVG» в первом запросе), среднего в течение всех дней в конце? Конечно, первая быстро сортируется с помощью 'WITH ROLLUP', избегая необходимости в' UNION'. – Wrikken

+0

timeDiff/count (id) -> GROUPED BY DATE – John

ответ

2

первой части запроса, вероятно, может быть записана в виде:

SELECT t.end, 
     AVG(CASE WHEN t.start != t.end THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1 
      END) as averageTime 
FROM store t 
GROUP BY t.end; 

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

Одним из способов является перебором способом:

SELECT t.end, 
     AVG(CASE WHEN t.start != t.end THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1 
      END) as averageTime 
FROM store t 
GROUP BY t.end 
UNION ALL 
SELECT 'Total', avg(AverageTime) 
FROM (SELECT t.end, 
      SUM(CASE WHEN t.start != t.end THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1 
       END) as averageTime 
     FROM store t 
     GROUP BY t.end 
    ) t; 
+0

Нет выхода для общей строки 1.8889, она должна быть суммой первых трех строк, 5.6667. – John

+0

Я только что переключил avg, чтобы суммировать в последнем запросе, и это то, что мне нужно. Спасибо за правильное направление;) – John

0

Ваш вопрос непонятен. Но, полагаю, вам нужно Среднее. Как уже упоминалось @samD,

вторая часть вас запрос может быть записан в виде

SELECT 'Total', AVG (случай, когда (t.start! = T.end) THEN TIMESTAMPDIFF (день, т .start, t.end) ELSE 1 END), как averageTime из магазина т

0

Вы ошибочно предполагая, что COUNT(t.id) в первом запросе представляет общее количество строк, в то время как он на самом деле зависит также от пункта GROUP BY. Если вы умножаете отдельные строки на количество дней, итоговые суммы также складываются. Удалите деление на COUNT(t.id), и итоговые суммы будут складываться, и вы будете правильно иметь сгруппированные SUM как ожидалось.

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

+0

Нет, что я не усредняю ​​из строк. Я усредняю ​​по элементам в дате. Таким образом, каждая строка является ее собственным средним значением, основанным на том, сколько результатов было в этом диапазоне дат. Сумма, как предполагается, должна быть суммой этих средних. Не общее среднее. – John

Смежные вопросы