合并后将2列合并为一列

时间:2019-01-03 11:59:23

标签: sql inner-join

我不确定这是否有意义。 我来自程序员背景,这对我来说应该很有意义。 我具有基本的SQL经验,因此可以基本了解自己的工作,但是分析数据建模对我来说大多是新的和陌生的。

我有下表:

 - Campaign: id, name, etc.
 - Daily_Spending: id, campaign_id, date, spending
 - Daily_Revenue: id, campaign_id, date, revenue

我现在想将这些表加入campaign_id上的many_to_one表中,以有效地创建一个结果派生表,如下所示:

Daily_Campaign_Data: campaign_id, date, spending, revenue

支出和收入实际上为NULL或如果在特定日期不存在则为0。

首先:这样做仅仅是为了获得一个整洁的表,该表基本上包含所有支出和/或收入发生的日期是否有意义。

第二:解决这个问题的方法是什么?如果我像描述的那样共存这些日期字段,我似乎找不到任何将它们合并为一个字段的方法。

第三:在数据库世界中,还有其他更有意义的选择吗?

2 个答案:

答案 0 :(得分:1)

对于不匹配的行,您需要左连接和ifnull以获得0值

select a.campaign_id, a.date, a.spending, ifNull(b.revenue,0)
from table Campaign c 
left join Daily_Spending a ON c.compain_id = a.compain_id 
left join Daily_Revenuea  b ON c.compain_id = b.compain_id 

答案 1 :(得分:1)

您需要一个可用日期列表。然后使用cross join获得广告系列和日期的组合,最后使用left join获得所需的数据。

假设广告系列/日期在支出和收入表中没有重复:

select d.date, c.*,
       ds.spending, dr.revenue
from campaign c cross join
     (select date from daily_spending
      union  -- on purpose to remove duplicates
      select date from daily_revenue
     ) d left join
     daily_spending ds
     on ds.campaign_id = c.id and ds.date = d.date left join
     daily_revenue dr
     on dr.campaign_id = c.id and dr.date = d.date;