MySql Union的两个结果集

时间:2016-01-09 03:42:44

标签: mysql sql

我有两个结果集如下。我想要一个合并的结果,第一个结果的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)的最顶行。

2 个答案:

答案 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()