![](/img/trans.png)
[英]Counting and grouping NULL and non NULL values with count results in separate columns
[英]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 月没有返回(这当然是高度合乎逻辑的),但无论如何我都想在我的结果中返回它,值为 null(0、零等)。
我梦想的结果是这样的:
| Yearr | Monthh | Amount |
| ----- | ------ | ------ |
| 2021 | 10 | 2 |
| 2021 | 11 | 0 |
| 2021 | 12 | 1 |
| 2022 | 01 | 2 |
| 2022 | 02 | 1 |
我似乎找不到一个简单的解决方案。 你可以很容易地知道真正的分裂需要追溯到 2000 年。
顺便说一句,如果它很重要,我会在 SOQL 和 BigQuery 中运行这个查询。
希望一切都清楚,感谢您的帮助!
我认为最简单的方法之一是创建 2 个辅助表,一个包含您想要从中获取信息的年份(2000 年 - 当前年份),另一个包含月份(1-12),因此您可以执行外部联接使用您的实际表格并获取按年月创建的邮件数量。
假设表年被称为 Years_Table with year_value column 和 Months', Months_table with month_value column,那么你可以做
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 是一个日期时间字段,相反你应该执行不同的连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.