我有两个颜色的数据:日期和价值。我想减去每个月的平均值 - 比如说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'
我无法破解代码,因此我将数据放在一张表中。
答案 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