我有两个结果集如下。我想要一个合并的结果,第一个结果的NULL替换为第二个结果集的值。
[编辑 - 为清晰起见而添加]
第一个结果集是按月收集和汇总的实际数据。如果你看到第一个表的行是每个月。它们来自另一个收集历史数据的表。第二个结果集是下个月的预测值。我希望能够在可用的情况下显示实际值,并使用预测值填充' null'。
mysql> SELECT sf.date, sf.col1, sf.col2, sf.col3, sf.col4, sf.col5, sf.col6, sf.col7, sf.col8 FROM sf_table AS sf order by sf.date desc limit 3;
+------------+------+-------+----------+-------+---------+------+------+--------+
| date | col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 |
+------------+------+-------+----------+-------+---------+------+------+--------+
| 2015-12-01 | 5.00 | 48.20 | NULL | NULL | NULL | 2.24 | 0.24 | NULL |
| 2015-11-01 | 5.00 | 48.60 | 12288.50 | 69344 | 1282.00 | 2.26 | 0.12 | 238.11 |
| 2015-10-01 | 5.00 | 50.10 | 12201.40 | 69584 | 1161.00 | 2.07 | 0.12 | 238.04 |
+------------+------+-------+----------+-------+---------+------+------+------
mysql> SELECT mai.date, mai.col1, mai.col2, mai.col3, mai.col4, mai.col5, mai.col6, mai.col7 , mai.col8 FROM vw_month_ahead as mai order by ai.date desc limit 3;
+------------+----------+-----------+--------------+--------------+-------------+----------+----------+------------+
| date | col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 |
+------------+----------+-----------+--------------+--------------+-------------+----------+----------+------------+
| 2016-01-29 | 4.951949 | 47.433569 | 12379.161917 | 69778.974145 | 1369.281614 | 2.283758 | 0.229009 | 238.427982 |
+------------+----------+-----------+--------------+--------------+-------------+----------+----------+------------+
我怎样才能得到以下内容?
+------------+----------+-----------+--------------+--------------+-------------+----------+----------+------------+
| date | col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 |
+------------+----------+-----------+--------------+--------------+-------------+----------+----------+------------+
| 2015-12-01 | 5.00 | 48.20 | 12379.161917 | 69778.974145 | 1369.281614 | 2.24 | 0.24 | 238.427982 |
+------------+----------+-----------+--------------+--------------+-------------+----------+----------+------------+
请注意:Col3,Col4,Col5和Col8来自第二个结果集(vw_month_ahead),其他的是第一个结果集(sf_table)的最顶行。
答案 0 :(得分:1)
也许是这样的:
SELECT
sf.date
, coalesce(sf.col1,mai.col1)
, coalesce(sf.col2,mai.col2)
, coalesce(sf.col3,mai.col3)
, coalesce(sf.col4,mai.col4)
, coalesce(sf.col5,mai.col5)
, coalesce(sf.col6,mai.col6)
, coalesce(sf.col7,mai.col7)
, coalesce(sf.col8,mai.col8)
FROM sf_table AS sf
left join vw_month_ahead AS mai
on sf.date = date_add(date_add(mai.date,INTERVAL -(day(mai.date)-1) DAY),INTERVAL -1 MONTH)
ORDER BY
sf.date DESC limit 3;
如果可用则显示来自sf_table的数据,如果不存在,则显示来自vw_month_ahead的数据。
[编辑]请注意,上面提出的加入条件会将日期减少到月初,然后扣除一个月。例如2016-01-29成为2016-01-01然后它变成2015-12-01,以便它可以与sf_table日期对齐。
如果没有任何数据可用,则可以返回零,如下所示:
SELECT
sf.date
, coalesce(sf.col1,mai.col1,0)
, coalesce(sf.col2,mai.col2,0)
...
答案 1 :(得分:1)
由于评论将mai
描述为仅包含一行,您可以执行以下操作:
SELECT sf.date, IFNULL(sf.col1, mai.col1) col1, IFNULL(sf.col2, mai.col2) col2, ...
FROM sf_table AS sf
LEFT JOIN vw_month_ahead AS mai
ORDER BY sf.date DESC;
此查询将两个表连接在一起,并且sf
中的值为null时,使用mai
中的值(如果mai中没有行,则可以为null)。请注意,您必须以这种方式为要合并的每列重复IFNULL()列描述。它很乏味,是的,但它会起作用。
如果您需要将此扩展到多个表格,那么您可以使用COALESCE()
代替IFNULL()