我希望我能把我的问题说清楚。
我有一个名为的表tweets
,我想从中提取daterange
表中每个数据的信息。该表包含 142 个日期,其中 102 个日期的属性trading
(开市日)设置为 1 ( trading=1
)。
下面的查询从tweets
表中提取 20 家公司(用 标识sp100_id
)的信息。因此,预期的结果集包含 20 x 102 = 2,040 行。但是,我只返回了 1,987 行,因为对于某些日期公司组合,该tweets
表不包含任何数据。但是,我需要将这些“空天”包含在结果集中。我想我可以通过使用COALESCE(X, 0)
,0
如果没有数据就返回,但结果是一样的:1,987 行。
根据这些信息和下面的查询,有人知道我如何让它为表中的每个返回 102 行(每个daterange._date
带有1 行trading=1
)吗?sp100_id
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 大师来说是清楚的 :-)