2015-04-28 3 views
-1

Я хочу получить average расчетного sum. Я попытался синтаксис из this stackoverflow answer Так что мой SQL-запрос выглядит следующим образом:SQL AVG SUM

SELECT AVG(iq.stockvalue_sum), iq.date 
FROM(
    SELECT CONCAT(DATE_FORMAT(s.date, '%Y'), '-01-01') as date, 
    SUM(GREATEST(s.stockvalue,0)) as stockvalue_sum 
    FROM stockvalues s 
    GROUP BY CONCAT(DATE_FORMAT(s.date, '%Y'), '-01-01') 
) iq 

Однако это не дает мне правильную среднюю. Я хочу получить средний stockvalue за каждый год. Идея, лежащая в основе таблицы, состоит в том, чтобы каждый день сохранять запас и запас для каждого продукта. Таким образом, этот speciq-запрос должен показывать среднее значение запаса за каждый год, в котором он имеет данные.

Edit: выходных данных Sample

Stockvalue | Year 
_________________ 
- 205  | 2015 
- 300  | 2014 

Входные данные:

pid | val | date 
______________________ 
- 1 | 100 | 28-04-2015 
- 2 | 150 | 28-04-2015 
- 1 | 80 | 27-04-2015 
- 2 | 80 | 27-04-2015 
.... 
- 1 | 100 | 29-01-2014 
- 2 | 100 | 29-01-2014 
- 1 | 200 | 30-01-2014 
- 2 | 200 | 30-01-2014 

Поэтому мне нужно вычислить знать среднее значение total stockvalue. Таким образом, сумма всех stockvalues ​​за день X и среднее значение X

+0

Ваш внешний запрос отсутствует группу по, но так как столбец логической группировки ('iq.date') совпадает с внутренним запросом, это не имеет особого смысла, т. е. ваш внутренний запрос будет возвращать только один результат в год, поэтому, взяв среднее значение этой одной строки, бессмысленно , Поэтому я немного запутался в отношении ваших требований, возможно, некоторые примеры данных и ожидаемый результат помогут? – GarethD

+0

@GarethD Я добавил некоторые примеры данных – Bram

+0

Этот образец вывода не помогает без ввода образца. Мое мнение состояло в том, что я не понимаю, зачем вам нужен «СУМ» вообще, не можете ли вы просто сделать среднее значение напрямую, поэтому измените SUM (GREATEST (s.stockvalue, 0)) 'на' AVG (GREATEST (s) .stockvalue, 0)) 'и полностью избавиться от внешнего запроса. – GarethD

ответ

1

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

SELECT AVG(s.Stockvalue) AS Stockvalue 
     YEAR(s.Date) AS Date 
FROM ( 
      SELECT DATE(s.Date) AS Date, 
        SUM(GREATEST(s.stockvalue,0)) AS Stockvalue 
      FROM stockvalues AS s 
      GROUP BY DATE(s.Date) 
     ) AS s 
GROUP BY YEAR(s.Date); 
+0

Да, вы правы, мне приходилось группироваться по дате, а затем по годам. Спасибо! – Bram

4

Как минимум вам не хватает в вашем внешнем запросе на group by:

SELECT AVG(iq.stockvalue_sum), iq.date 
FROM(
    SELECT CONCAT(DATE_FORMAT(s.date, '%Y'), '-01-01') as date, 
    SUM(GREATEST(s.stockvalue,0)) as stockvalue_sum 
    FROM stockvalues s 
    GROUP BY CONCAT(DATE_FORMAT(s.date, '%Y'), '-01-01') 
) iq 
GROUP BY iq.date 

Однако, учитывая ваш внутренний запрос возвращает один год с суммарным значением, среднее значение этого значения будет одинаковым. Возможно, вы сможете прояснить свои намерения. Вы уверены, что вам нужен внутренний запрос? Возможно, это все, что вам нужно?

select avg(GREATEST(stockvalue,0)), CONCAT(DATE_FORMAT(s.date, '%Y'), '-01-01') as date 
from stockvalues 
group by CONCAT(DATE_FORMAT(s.date, '%Y'), '-01-01') 
+0

Нет, это не работает. Я сохраняю значение запаса для каждого продукта в базе данных. Поэтому, чтобы получить среднее значение за этот день, мне нужно сделать сумму всех запасов. И в среднем. Поэтому, чтобы сделать вещи более ясными. Мне не нужно знать среднее значение запасов для продуктов. Но на тот день. – Bram