计算SQL Server中每个月的平均值

时间:2020-04-01 14:23:35

标签: sql sql-server

我有两个桌子

促销

ID | Name
---+---------    
1    Front
2    Middle
3    Back

促销价

ID |    Date    | Rate | PromoID
---+------------+------+----------
1    2020-01-01   100       1
2    2020-01-02   200       1
3    2020-02-03   300       1
4    2020-02-01   150       2
5    2020-01-02   250       2
6    2020-03-03   350       2
7    2020-03-01   200       3
8    2020-01-02   400       3
9    2020-01-03   600       3

我想计算平均值。像这样

Name   | Avg(Jan) | Avg(Feb) | Avg(Mar)
-------+----------+----------+----------
Front      150        300        NULL
Middle     250        150        350
Back       500        NULL       200

像枢轴之类的东西。

请帮助我。预先感谢

我尝试过的事情:

SELECT * FROM
(
    SELECT P.ID, P.Name, AVG(Rate) AS 'AVG' FROM PromoRate PR
    INNER JOIN Promo P ON P.ID = PR.ProfileID
    WHERE MONTH(Date) = MONTH(GETDATE())
    GROUP BY P.Name, P.ID
) M1
LEFT JOIN
(
    SELECT P.ID, P.Name, AVG(Rate) AS 'AVG' FROM PromoRate PR
    INNER JOIN Promo P ON P.ID = PR.ProfileID
    WHERE MONTH(Date) = MONTH(GETDATE()) + 1
    GROUP BY P.Name, P.ID
) M2 ON M1.ID = M2.ID
LEFT JOIN
(
    SELECT P.ID, P.Name, AVG(Rate) AS 'AVG' FROM PromoRate PR
    INNER JOIN Promo P ON P.ID = PR.ProfileID
    WHERE MONTH(Date) = MONTH(GETDATE()) + 2
    GROUP BY P.Name, P.ID
) M3 ON M2.ID = M3.ID

但是它没有按预期运行

1 个答案:

答案 0 :(得分:2)

您需要对Month(Date)进行分组,我也将使用DateAdd而不是month(GetDate())+2。然后,您可以使用一个查询,而不是在要运行时加入3个查询当您越过年线,或者如果您有多年,就会陷入麻烦。例如。在11月运行它还会返回当年和明年1月的结果。

如果这是存储过程的一部分,我还建议创建一个@startdate和@enddate变量,并首先进行设置。

declare @start datetime
    declare @end datetime

    select @start = convert(date,GETDATE()), @end = convert(date, DATEADD(month, 2, GETDATE()))

SELECT P.ID, P.Name, AVG(Rate) AS 'AVG' FROM PromoRate PR
    INNER JOIN Promo P ON P.ID = PR.ProfileID
    WHERE Convert(date, Date) > @start and convert(date, date) < @end
    GROUP BY P.Name, P.ID, MONTH(Date)

ETA:您还需要返回月份,以便填充数据透视表。

相关问题