微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在SQL Server中每月调整温度?

如何解决如何在SQL Server中每月调整温度?

我可以这样算出每年的平均温度:

select Ville,AVG(Temperature) as Temperature 
from Meteo 
where DateDonnees between '2011-01-01' and '2012-01-01' 
group by  Ville

enter image description here

问题是我想每月获取温度。

所以我找到了一个post来解释如何做到这一点:

select * from(
select Ville,Temperature as Temperature from Meteo where DateDonnees between '2011-01-01' and '2012-01-01' group by  Ville
)
pivot(
cast(AVG(Temperature)) AS DECIMAL(4,1) for DateDonnees in (
    1 JAN,2 FEB,3 MAR,4 APR,5 MAY,6 JUN,7 JUL,8 AUG,9 SEP,10 OCT,11 NOV,12 DEC)
))

并引发"Incorrect Syntax near the keyword 'pivot'."错误

这是我希望看到的结果:

enter image description here

解决方法

可以将MONTH函数放在横向联接中,然后在CASE逻辑中使用它来限制月份。像这样

select Ville as City,avg(case when mo.mon=1 then Temperature else 0 end) Jan,avg(case when mo.mon=2 then Temperature else 0 end) Feb,avg(case when mo.mon=3 then Temperature else 0 end) Mar,avg(case when mo.mon=4 then Temperature else 0 end) Apr,avg(case when mo.mon=5 then Temperature else 0 end) May,avg(case when mo.mon=6 then Temperature else 0 end) Jun,avg(case when mo.mon=7 then Temperature else 0 end) Jul,avg(case when mo.mon=8 then Temperature else 0 end) Aug,avg(case when mo.mon=9 then Temperature else 0 end) Sep,avg(case when mo.mon=10 then Temperature else 0 end) Oct,avg(case when mo.mon=11 then Temperature else 0 end) Nov,avg(case when mo.mon=12 then Temperature else 0 end) [Dec]
from Meteo m
     cross apply
     (select month(m.DateDonnees) mon) mo
where DateDonnees between '2011-01-01' and '2012-01-01' 
group by Ville;
,

我建议条件聚合:

select city,avg(case when datedonnees >= '20200101' and datedonnees < '20200201' then temperature end) jan,avg(case when datedonnees >= '20200201' and datedonnees < '20200301' then temperature end) feb,avg(case when datedonnees >= '20201201' and datedonnees < '20200401' then temperature end) mar,...
    avg(case when datedonnees >= '20201201' and datedonnees < '20210101' then temperature end) dec
from meteo
where datedonnees >= '20200101' and datedonnees < '20210101'
group by city

我们可以使用month()来稍微缩短语法,但它的效率可能比半开间隔短:

select city,avg(case when month(datedonnees) =  1 then temperature end) jan,avg(case when month(datedonnees) =  2 then temperature end) feb,avg(case when month(datedonnees) =  3 then temperature end) mar,...
    avg(case when month(datedonnees) = 12 then temperature end) dec
from meteo
where datedonnees >= '20200101' and datedonnees < '20210101'
group by city

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。