我有两个桌子
促销
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
但是它没有按预期运行
答案 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:您还需要返回月份,以便填充数据透视表。