如何将空值包含到按日期分组?
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 是一个日期时间字段,相反你应该执行不同的连接。
我想按月份和年份拆分添加到数据库中的电子邮件数量。
我的查询:
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 是一个日期时间字段,相反你应该执行不同的连接。