2016-11-04 3 views
0

У меня есть данные с двумя совпадениями: дата и значение. Я хочу, чтобы вычесть средние значения для каждого месяца - скажем, сентябрь и октябрь 2016 года я foloowing:SQL Вычесть две разные средние значения в одной таблице

SELECT 'September' as Month, Avg(Values) as Average From myTable 
    where MONTH(Date)='09' and YEAR(Date)='2016' 

SELECT 'October' as Month, Avg(Values) as Average From myTable 
    where MONTH(Date)='10' and YEAR(Date)='2016' 

Я не могу взломать код, так что я получаю мои данные в одной таблице.

ответ

1

Я хотел бы использовать условную агрегацию:

SELECT Avg(CASE WHEN MONTH(Date) = 9 and YEAR(Date) = 2016 THEN Values END) as sept_avg, 
     Avg(CASE WHEN MONTH(Date) = 10 and YEAR(Date) = 2016 THEN Values END) as oct_avg, 
     (Avg(CASE WHEN MONTH(Date) = 10 and YEAR(Date) = 2016 THEN Values END) - 
     Avg(CASE WHEN MONTH(Date) = 9 and YEAR(Date) = 2016 THEN Values END) 
     ) as difference 
From myTable 
    where 
From myTable 
Where YEAR(Date) = 2016 and MONTH(Date) IN (9, 10); 

Заметьте, что YEAR() и MONTH() номера возврата, без обязательств, поэтому константы, которые вы используете, не должен использовать одиночные кавычки.

0

Попробуйте, это нормально для результата SELECT Year,Month , AVG(Values) FROM MyTable WHERE YEAR(Date)='2016' GROUP BY Year,Month

0

SELECT DISTINCT Month (Date) в [Месяц], YEAR (дата), как [Год], AVG (значения) OVER (PARTITION BY МЕСЯЦ (дата), YEAR (дата)) ИЗ таблицы

ВЫВОДА

Month Year Avg 
9  2010 60 
10 2010 15 

Теперь вы можете написать КТР, чтобы получить окончательный Avg различия, как показано ниже

;with cte as(
SELECT DISTINCT MONTH(Date) as [Month],YEAR(Date) as [Year], 
AVG(Values) OVER(PARTITION BY MONTH(Date),YEAR(Date)) val 
FROM Table 
) 
SELECT DISTINCT t1.val - t2.val FROM cte t1 
       CROSS JOIN cte t2 
       WHERE t1.[Month]=9 AND t2.[Month]=10 
0

Пожалуйста, попробуйте это, он решит вашу проблему навсегда.

SELECT 
     MONTH([current].Date) as Month, avg([current].[Values]) Avgr, ISNULL(avg([current].[Values]), 0) - avg(next.[Values]) as Diff 
FROM  myTable AS [current] 
LEFT JOIN myTable AS [next] 
     ON MONTH([next].Date) = (SELECT MIN(MONTH(Date)) FROM myTable WHERE MONTH(Date) > MONTH([current].Date)) 
GROUP BY MONTH([current].date) 
0

Использование PIVOT

Btw - я предлагаю вам не использовать зарезервированные имена, как «ценность» для ваших имен столбцов.

DECLARE @t table(date date, value int) 

INSERT @t values('20160901',20),('20161001',10),('20161001',12) 

;WITH CTE as 
(
    SELECT value, month(date) m, year(date) year 
    FROM @t 
    WHERE date >='2016-09-01' 
    and date < '2016-11-01' 
) 
SELECT year, [10]-[9] difference 
FROM CTE 
PIVOT 
(avg(value) 
FOR m 
in([9],[10]) 
)AS p 

Fiddle

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