如何将空值包含到按日期分组?

How to include null values into grouping by date?

我想按月份和年份拆分添加到数据库中的电子邮件数量。

我的查询:

    SELECT TOP 200 Monthh, Yearr, COUNT(Email) AS Amount
    FROM
    (SELECT Email, MONTH(Added_date) AS Monthh, YEAR(Added_date) AS Yearr
    FROM Contacts) a
    GROUP BY Monthh, Yearr
    ORDER BY CAST(Yearr AS INT), CAST(Monthh AS INT)

但是假设我的(非常简化的)联系人列表如下所示:

|     Email       |   Added_date   |
| --------------- | -------------- |
| max@gmail.com   |  2021-10-01    |
| emma@gmail.com  |  2021-10-05    |
| tony@gmail.com  |  2021-12-06    |
| mark@gmail.com  |  2022-01-23    |
| lucy@gmail.com  |  2022-01-28    |
| chris@gmail.com |  2022-02-04    |

在这种情况下,结果将如下所示:

| Yearr | Monthh | Amount |
| ----- | ------ | ------ |
| 2021  |   10   |   2    |
| 2021  |   12   |   1    |
| 2022  |   01   |   2    |
| 2022  |   02   |   1    |

这行得通。但是,有一个小问题 - 2021 年 11 月没有 returned(这当然是高度合乎逻辑的),但无论如何我都想 return 在我的结果中使用 null(0、零等)。 ) 值。

我梦想的结果是这样的:

| Yearr | Monthh | Amount |
| ----- | ------ | ------ |
| 2021  |   10   |   2    |
| 2021  |   11   |   0    |
| 2021  |   12   |   1    |
| 2022  |   01   |   2    |
| 2022  |   02   |   1    |

我似乎找不到简单的解决方案。你可以很容易地知道真正的分裂需要追溯到 2000 年。

顺便说一句,如果重要的话,我是 运行 SOQL 和 BigQuery 中的这个查询。

希望一切顺利,感谢您的帮助!

我认为最简单的方法之一是创建 2 个辅助 tables,一个包含您想要从中获取信息的年份(2000 年-当前年份),另一个包含月份(1- 12), 所以你可以用你的实际 table 执行外部连接并获得 year-month.

创建的邮件数量

假设 table 年在 year_value 列中称为 Years_Table,在 month_value 列中称为月,Months_table,那么您可以这样做

SELECT TOP 200 month_value, year_value, COUNT(Email) AS Amount
FROM Contacts 
RIGHT OUTER JOIN (SELECT year_value, month_value FROM Years_Table CROSS JOIN Months_Table) AS AUX_TABLE ON AUX_TABLE.year_value = YEAR(Added_Date) AND AUX_TABLE.month_value = MONTH(Added_Date)
GROUP BY month_value, year_value
ORDER BY year_value, month_value

注意:我忽略了你的 CAST 指令,因为 Year(added_date) 应该是一个数字,假设你的字段 added_date 是一个日期时间字段,相反你应该执行不同的连接。