sql - 在每月最后一天之前填充缺失数据的行

标签 sql sql-server

我有一张看起来像这样的 table

UserID        LastDayofMonth              Count
1234          2015-09-30 00:00:00         12
1237          2015-09-30 00:00:00         5
3233          2015-09-30 00:00:00         3
8336          2015-09-30 00:00:00         22
1234          2015-10-31 00:00:00         8
1237          2015-10-31 00:00:00         5
3233          2015-10-31 00:00:00         7
8336          2015-11-30 00:00:00         52
1234          2015-11-30 00:00:00         8
1237          2015-11-30 00:00:00         5
3233          2015-11-30 00:00:00         7

(大约有 10,000 行)。正如您在示例中看到的,用户 ID 8336 没有 10 月 31 日的记录(日期是每月的,但始终是该月的最后一天,我想保留这一天)。如何返回一个包含四个月期间记录的表,以便像 8336 这样的用户获得像这样的记录

8336          2015-10-31 00:00:00         0

我确实有一个日历表,其中包含我可以使用的所有日期。

最佳答案

如果我理解正确的话,您需要每个用户和每个月底的记录。并且,如果该记录当前不存在,则您需要值为 0。

这是一个两步过程。首先使用交叉连接生成所有行。然后使用 left join 获取值。

所以:

select u.userId, l.LastDayofMonth, coalesce(t.cnt, 0) as cnt
from (select distinct userId from t) u cross join
     (select distinct LastDayofMonth from t) l left join
     t
     on t.userId = u.userId and t.LastDayofMonth = l.LastDayofMonth;

关于sql - 在每月最后一天之前填充缺失数据的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34322533/

相关文章:

php - 更改后刷新页面而不重置搜索查询

sql-server - 抛出错误与升高错误

MySQL - 无法添加外键约束

sql - 如何在不使用 CASE WHEN 的情况下将 GROUP BY 作为参数?

mysql - 如何更新名称与 SQL 格式匹配的表的行

sql - 从表 SQL 中查找 Maximum(table.column1,table.column2,table.column3,...) 为 'MaximumValue'

c# - ASP.NET Web API 发生错误

php - 为什么 CodeIgniter 会耗尽允许的内存大小?

mysql - REPLACE INTO sql 查询有 2 个键?

sql - 为什么指定 ORDER BY 子句时 SQL Server 会忽略字符串连接中的值