问题
在某张表需要统计年度数据时,需要按地区按年统计,但是某些地区或年份没有上传任何数据,查询出的结果缺少数据
地区 | 年份 | 总量 |
---|
新吴区 | 2021 | 648 | 滨湖区 | 2021 | 187 | 梁溪区 | 2021 | 679467 | 锡山区 | 2021 | 5661 | 经开区 | 2020 | 589 | 梁溪区 | 2020 | 150 | 锡山区 | 2020 | 295 | 滨湖区 | 2019 | 636 | 锡山区 | 2019 | 276 |
我们需要的是每个地区每个年份的数据,很明显缺少
目标
按地区按年统计时,补全没有的数据
解决方法
既然需要的是每个地区每个年份的数据,又知道LEFT JOIN 可以得到所有的左侧数据,所以可以先做张左侧工具表,该表的内容就是需要的数据分类,即地区与年份的笛卡尔积
SELECT DISTINCT YEAR(AD.start_date) AS toYear
FROM activity_data AS AD
SELECT AR.name
FROM area AS AR
WHERE AR.pid=320200
地区 |
---|
锡山区 | 惠山区 | 滨湖区 | 梁溪区 | 新吴区 | 江阴市 | 宜兴市 | 经开区 |
两个数据表内连接,不设置条件
SELECT *
FROM (
SELECT DISTINCT YEAR(AD.start_date) AS toYear
FROM activity_data AS AD
) AS A
INNER JOIN (
SELECT AR.name
FROM area AS AR
WHERE AR.pid=320200
) AS B
年份 | 地区 |
---|
2021 | 经开区 | 2021 | 宜兴市 | 2021 | 江阴市 | 2021 | 新吴区 | 2021 | 梁溪区 | 2021 | 滨湖区 | 2021 | 惠山区 | 2021 | 锡山区 | 2020 | 经开区 | 2020 | 宜兴市 | 2020 | 江阴市 | 2020 | 新吴区 | 2020 | 梁溪区 | 2020 | 滨湖区 | 2020 | 惠山区 | 2020 | 锡山区 | 2019 | 经开区 | 2019 | 宜兴市 | 2019 | 江阴市 | 2019 | 新吴区 | … | … |
再通过LEFT JOIN
SELECT *
FROM (
工具表语句
) AS UTIL
LEFT JOIN (
原本查询语句
) AS A
ON A.name=UTIL.name AND A.toYear=UTIL.toYear
结果:
年份 | 地区 | 总量 |
---|
2021 | 经开区 7542 | | 2021 | 宜兴市 | 0 | 2021 | 江阴市 | 0 | 2021 | 新吴区 | 648 | 2021 | 梁溪区 | 679467 | 2021 | 滨湖区 | 187 | 2021 | 惠山区 | 0 | 2021 | 锡山区 | 5661 | 2020 | 经开区 | 589 | 2020 | 宜兴市 | 0 | 2020 | 江阴市 | 0 | 2020 | 新吴区 | 0 | 2020 | 梁溪区 | 150 | 2020 | 滨湖区 | 0 | 2020 | 惠山区 | 0 | 2020 | 锡山区 | 295 | 2019 | 经开区 | 0 | 2019 | 宜兴市 | 0 | 2019 | 江阴市 | 0 | 2019 | 新吴区 | 0 | … | … | … |
|