SQL GROUP BY 与 LEFT JOIN MS SQL 服务器
SQL GROUP BY with LEFT JOIN MS SQL Server
我有一个日历 table (c) 有一组 3 个月的日期:
2021-06-01
2021-07-01
2021-08-01
我有一个统计数据 table (s),其中包含网站上每个产品的浏览量。
Prod1 | 2021-06-01
Prod1 | 2021-06-01
Prod1 | 2021-08-01
Prod2 | 2021-07-01
Prod2 | 2021-08-01
Prod2 | 2021-08-01
我需要统计每个产品每个月的浏览量,不管有没有浏览量。
我遵循了许多 SO答案(SQL - Group By with Left Join),但我看不出下面的代码有问题。
DECLARE @Start date
SET @Start=DATEADD(month, DATEDIFF(month, 0,DATEADD(month, -3, getdate())), 0)
SELECT
s.ProductID,
c.themonth,
ISNULL(Count(s.ProductID),0) As Total_Views
FROM
#calendar c
LEFT JOIN
(
SELECT ProductID,FirstDayOfMonth FROM Stats WHERE FirstDayofMonth >= @Start
) s
ON c.themonth = s.FirstDayOfMonth
GROUP BY
c.themonth,s.ProductID
ORDER BY s.ProductID,c.themonth
我只获得在特定月份有浏览量的 ProductID 的结果,而不是每个 ProductID 和每个月的行,无论是否有浏览量。
根据上面的数据,我想要的结果是:
Prod1 | 2021-06-01 | 2
Prod1 | 2021-07-01 | 0
Prod1 | 2021-08-01 | 1
Prod2 | 2021-06-01 | 0
Prod2 | 2021-07-01 | 1
Prod2 | 2021-08-01 | 2
使用 cross join
生成行,然后使用 left join
引入数据:
select c.themonth, p.productid,
count(s.productid) as sales_in_month
from #calendar c cross join
(select distinct productid from stats) p left join
stats s
on s.productid = p.productid and
s.firstdayofmonth = c.themonth
group by c.themonth, p.productid;
我有一个日历 table (c) 有一组 3 个月的日期:
2021-06-01
2021-07-01
2021-08-01
我有一个统计数据 table (s),其中包含网站上每个产品的浏览量。
Prod1 | 2021-06-01
Prod1 | 2021-06-01
Prod1 | 2021-08-01
Prod2 | 2021-07-01
Prod2 | 2021-08-01
Prod2 | 2021-08-01
我需要统计每个产品每个月的浏览量,不管有没有浏览量。
我遵循了许多 SO答案(SQL - Group By with Left Join),但我看不出下面的代码有问题。
DECLARE @Start date
SET @Start=DATEADD(month, DATEDIFF(month, 0,DATEADD(month, -3, getdate())), 0)
SELECT
s.ProductID,
c.themonth,
ISNULL(Count(s.ProductID),0) As Total_Views
FROM
#calendar c
LEFT JOIN
(
SELECT ProductID,FirstDayOfMonth FROM Stats WHERE FirstDayofMonth >= @Start
) s
ON c.themonth = s.FirstDayOfMonth
GROUP BY
c.themonth,s.ProductID
ORDER BY s.ProductID,c.themonth
我只获得在特定月份有浏览量的 ProductID 的结果,而不是每个 ProductID 和每个月的行,无论是否有浏览量。
根据上面的数据,我想要的结果是:
Prod1 | 2021-06-01 | 2
Prod1 | 2021-07-01 | 0
Prod1 | 2021-08-01 | 1
Prod2 | 2021-06-01 | 0
Prod2 | 2021-07-01 | 1
Prod2 | 2021-08-01 | 2
使用 cross join
生成行,然后使用 left join
引入数据:
select c.themonth, p.productid,
count(s.productid) as sales_in_month
from #calendar c cross join
(select distinct productid from stats) p left join
stats s
on s.productid = p.productid and
s.firstdayofmonth = c.themonth
group by c.themonth, p.productid;