mysql - 即使该日期没有数据(在这种情况下,该行应该用零填充),如何为每个日期返回一行?

标签 mysql coalesce

我希望我能够弄清楚我的问题。

我有一个名为 tweets 的表我想从中提取 daterange 中每个数据的信息 table 。该表包含 142 个日期,其中 102 个日期具有属性 trading (市场开市日)设置为 1 ( trading=1 )。

以下查询从 tweets 中提取信息表 20 家公司(由 sp100_id 标识)。因此,预期结果集包含 20 x 102 = 2,040 行。 但是,我只返回 1,987 行,因为对于某些日期-公司组合,tweets表不包含任何数据。然而,我需要将这些“空的日子”包含在结果集中。我想我可以通过使用 COALESCE(X, 0) 来完成此任务,返回0如果没有数据,但结果是相同的:1,987 行。

根据这些信息和下面的查询,有人知道如何让它为每个 daterange._date 返回 102 行(每个 trading=1sp100_id 各 1 行)在 tweets表?

SELECT
  sp100.sp100_id,
  daterange._date,
  COALESCE(SUM(IF(tweets.classify1=2, tweets.`retweet_count`, 0)),0) AS `pos-retweet`,
  COALESCE(SUM(IF(tweets.classify1=2, tweets.`user-quality`,  0)),0) AS `pos-quality`,
  COALESCE(SUM(IF(tweets.classify1=2, tweets.`follow`,        0)),0) AS `pos-follow`,
  COALESCE(SUM(IF(tweets.classify1=3, tweets.`retweet_count`, 0)),0) AS `neg-retweet`,
  COALESCE(SUM(IF(tweets.classify1=3, tweets.`user-quality`,  0)),0) AS `neg-quality`,
  COALESCE(SUM(IF(tweets.classify1=3, tweets.`follow`,        0)),0) AS `neg-follow`
FROM
  sp100
CROSS JOIN
  daterange
LEFT JOIN
  tweets
  ON tweets.nyse_date = daterange._date
  AND tweets.sp100_id  = sp100.sp100_id
WHERE sp100.sp100_id BETWEEN 1 AND 20 AND tweets.type != 1 AND daterange.trading = 1
GROUP BY
  sp100.sp100_id, daterange._date

在任何其他情况下,我都会为您提供一个 SQLFiddle,但是将用于 SQLFiddle 的表的适当部分导出将需要大量工作,而解决方案对于某些真正的 SQL 专家来说可能是清楚的:-)

最佳答案

问题来自于要求 tweets.type != 1在你的WHERE条款。

对于没有关联推文的日期,外部联接将导致所有 tweets列,包括tweets.type ,是NULL 。如 Working with NULL Values 下所述:

Because the result of any arithmetic comparison with NULL is also NULL, you cannot obtain any meaningful results from such comparisons.

In MySQL, 0 or NULL means false and anything else means true. The default truth value from a boolean operation is 1.

因此此类记录会按您的 WHERE 进行过滤条款。

@Martin Smith commented ,您可以将此过滤条件移至 ON外连接的子句(以便仅针对实际 tweets 记录而不是模拟 NULL 记录执行测试)。

或者,您可以重写过滤器来处理 NULL 。例如,使用 NULL -safe equality operator :

NOT tweets.type <=> 1

顺便说一句,我通常不会打扰 daterange表并忽略结果集中没有数据的日期:相反,我在应用程序代码中处理缺失的日期。

关于mysql - 即使该日期没有数据(在这种情况下,该行应该用零填充),如何为每个日期返回一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12239597/

相关文章:

mysql - 如何使用唯一列值作为另一个 select 语句的输入

Mysql - 按列选择最高值

Mysql创建名称中带有特殊字符的数据库

mysql - MySQL UPDATE 查询中的 "intermediate"变量

r - 组合数据框中包含 NA 的行以形成完整的行

php - Yii Active Record COALESCE 不显示结果

mysql - 事务回滚在 karaf 中不起作用

sql-server - 连接多个表中的多行

当结果为零时显示聚合数据的 SQL 查询

sql - 在查询中找不到匹配项时如何显示默认值?