我不确定这是否有意义。 我来自程序员背景,这对我来说应该很有意义。 我具有基本的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。
首先:这样做仅仅是为了获得一个整洁的表,该表基本上包含所有支出和/或收入发生的日期是否有意义。
第二:解决这个问题的方法是什么?如果我像描述的那样共存这些日期字段,我似乎找不到任何将它们合并为一个字段的方法。
第三:在数据库世界中,还有其他更有意义的选择吗?
答案 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;