起初,我的问题可能看似简单,之前已被问过。忍受我 - 我认为这是一个独特的问题。
表A包含State
,County
,Month
,Year
和Rate
列。每个州,县综合体都列出了几次,具有不同的日期和费率。有些行设置了State和County,该行中的其他所有内容都为NULL。
表B列出了每个月和每年的默认费率。列为Month
,Year
和Rate
。在这张表中,我有几年的默认数据。
因此,对于表A中的每个州,县复合,我想用表B中的数据填写任何缺失的数据。
我创建了一个类似于表A的表C,除了用表B中的默认数据填充所有数据。然后我一起尝试UNION表A和表C.但我最终遇到了两个问题。
首先,我结束了重复的行,除了速率之外,所有内容都相同。在这种情况下,我想只保留表A中最初的行(而不是'默认速率')。
第二,我最后得到的行有State和County设置,但其他一切都是NULL。我需要为每个默认速率用行替换这些行。
所以最后我希望每个州,县,月,年复合都有一行。
是否可以按照我的描述组合表格。
如果您需要澄清任何内容,请与我们联系。感谢。
表A有几千行。每个州有1到48行,县综合:
+-------+--------+-------+------+------+ | State | County | Month | Year | Rate | +-------+--------+-------+------+------+ | NY | Albany | 1 | 2011 | ### | | NY | Albany | 2 | 2011 | ### | ... | NY | Albany | 12 | 2011 | ### | | NY | Albany | 1 | 2012 | ### | ... | NY | Albany | 12 | 2012 | ### | | NY | Monroe | 1 | 2011 | ### | ... | NY | Monroe | 12 | 2011 | ### | | NY | Essex | NULL | NULL | NULL | +-------+--------+-------+------+------+
表B有36行。每个月超过3年的一行:
+-------+------+------+ | Month | Year | Rate | +-------+------+------+ | 1 | 2011 | *** | | 2 | 2011 | *** | | ... | | | | 12 | 2011 | *** | | 1 | 2012 | *** | | ... | | | | 12 | 2012 | *** | | 1 | 2013 | *** | | ... | | | | 12 | 2013 | *** | +-------+------+------+
结果表的行数多于表A.每个州,县组合都至少有默认表中的36行:
+-------+--------+-------+------+------+ | State | County | Month | Year | Rate | +-------+--------+-------+------+------+ | NY | Albany | 1 | 2011 | ### | | ... | | | | | | NY | Albany | 12 | 2011 | ### | | NY | Albany | 1 | 2012 | ### | | ... | | | | | | NY | Albany | 12 | 2012 | ### | | NY | Albany | 1 | 2013 | *** | | ... | | | | | | NY | Albany | 12 | 2013 | *** | | NY | Monroe | 1 | 2011 | ### | | ... | | | | | | NY | Monroe | 12 | 2011 | ### | | NY | Monroe | 1 | 2012 | *** | | ... | | | | | | NY | Monroe | 12 | 2012 | *** | | NY | Monroe | 1 | 2013 | *** | | ... | | | | | | NY | Monroe | 12 | 2013 | *** | | NY | Essex | 1 | 2011 | *** | | ... | | | | | | NY | Essex | 12 | 2011 | *** | | NY | Essex | 1 | 2012 | *** | | ... | | | | | | NY | Essex | 12 | 2012 | *** | | NY | Essex | 1 | 2013 | *** | | ... | | | | | | NY | Essex | 12 | 2013 | *** | +-------+--------+-------+------+------+
密钥:***
是默认表中的费率。 ###
是来自其他表的费率
答案 0 :(得分:3)
我认为最好的方法是生成地理和时间的所有组合。您可以从state
获取county
和tablea
,然后与year
中的month
和tableb
交叉加入。然后使用left join
查看tablea
中是否有任何值。如果是这样,请选择它。否则,请从tableb
:
select sc.state, sc.county, ym.year, ym.month, coalesce(a.rate, ym.rate) as rate
from (select distinct state, county from tablea) sc cross join
tableb ym left outer join
tablea a
on a.state = sc.state and a.county = sc.county and
a.year = ym.year and a.month = ym.month ;
+ 7chars