我希望我能够弄清楚我的问题。
我有一个名为 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=1
和 sp100_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 alsoNULL
, you cannot obtain any meaningful results from such comparisons.In MySQL,
0
orNULL
means false and anything else means true. The default truth value from a boolean operation is1
.
因此此类记录会按您的 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/