如果不存在,则将值设置为0

时间:2015-04-18 13:40:44

标签: sql database sqlite

目前,我使用以下查询从SQLite数据库获得每小时的平均评分:

SELECT AVG(rating) as avgRating, strftime('%H:00', date) as hour FROM ratings
WHERE questionId = 1 AND strftime('%Y-%m-%d', date) = strftime('%Y-%m-%d', 'now')
GROUP BY strftime('%H', date);

现在我希望每小时都没有任何价值,得到的平均评分为0,这可能吗?

1 个答案:

答案 0 :(得分:3)

典型的答案是(1)在应用程序中执行此操作,以及(2)使用左连接。对于后者,您需要一个所有小时的列表,这可能很麻烦。

在某些情况下,小时数都存在于数据中,但它们会被where子句过滤掉。在这种情况下,切换到条件聚合通常是获得所需内容的最简单方法:

SELECT COALESCE(AVG(CASE WHEN questionId = 1 THEN rating END), 0) as avgRating,
       strftime('%H:00', date) as hour
FROM ratings r
WHERE strftime('%Y-%m-%d', date) = strftime('%Y-%m-%d', 'now')
GROUP BY strftime('%H', date);

这并不适用于所有情况,但如果确实如此,这是一个简单的解决方案。