SQL在一个表中减去两个不同的平均值

时间:2016-11-04 09:55:41

标签: sql sql-server

我有两个颜色的数据:日期和价值。我想减去每个月的平均值 - 比如说2016年9月和10月。我做的是:

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'

我无法破解代码,因此我将数据放在一张表中。

5 个答案:

答案 0 :(得分: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()返回数字,没有字符串,因此您使用的常量不应使用单引号。

答案 1 :(得分:0)

试试这个,结果是否合适 SELECT Year,Month , AVG(Values) FROM MyTable WHERE YEAR(Date)='2016' GROUP BY Year,Month

答案 2 :(得分:0)

选择DISTINCT MONTH(日期)为[月],年(日期)为[年], AVG(值)超过(按月划分(日期),年份(日期)) 从表

输出

Month Year  Avg
9     2010   60
10    2010   15

现在您可以编写CTE以获得最终的平均差异,如下所示

;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

答案 3 :(得分: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)

答案 4 :(得分:0)

使用PIVOT

顺便说一句 - 我建议您不要为列名使用“值”之类的保留名称。

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

相关问题