对于有SQL经验的人来说这是一个挑战(在这种情况下是MS-Access)
我有2个表:holdings
和valuations
。
holdings
包含特定帐户在指定日期持有的所有资产及其各自的值。这些是字段:
id
{primary key / auto-inc},accountid
{int},holdingdate
{date},holdingid
{int},holdingvalue
{双}
valuations
包含特定日期特定帐户所有权的总和。这些是字段:
id
{primary key / auto-inc},accountid
{int},valuationdate
{date},valuation
{double}。
2012年1月之后,对于valuation
表格中的每个valuations
,我在holdings
表格中有相应的馆藏集合,其总和值=估值值。
在此日期之前,我只有估值,没有持股。
例如在valuations
中我会有这样的记录:
id | accountid | valuationdate | valuation
------------------------------------------------
56 | 12345 | 2013-03-31 | 2000000
相应地,我会在这个日期拥有这些帐户(此帐户的总数为valuation
:
id | accountid | holdingdate | holdingid | holdingvalue
---------------------------------------------------------------
250 | 12345 | 2013-03-31 | 16 | 1000000
251 | 12345 | 2013-03-31 | 38 | 500000
252 | 12345 | 2013-03-31 | 27 | 500000
如上所述,在某些情况下,我只有valuations
表中的记录,我没有相应的控件。
为了简化/优化我的数据库结构,我想删除valuations
表,因为它基本上是复制应该出现在holdings
表中的信息,只需将帐户的资产相加即可给定的日期。为了获得客户未来的估值,我可以简单地将他们的持有量与给定日期相加,而无需完全取消对valuations
表的需求。
我的目标是使用holdings
中的数据填充valuations
表,以查找不存在的日期。
基本上,如果账号/估价日期组合中不存在任何持股,则在该持有表中插入一个虚拟持有(holdingid = 999
),该账号/估值日期等于该日期的估值。
是否可以构造一个SQL查询来实现上述目标?
答案 0 :(得分:3)
其中任何一个都应该有效:
insert into holdings (accountid, holdingdate, holdingid, holdingvalue)
select v.accountid, v.valuationdate, 999, v.valuation
from valuations v
left join holdings h on h.accountid=v.accountid and h.holdingdate=v.valuationdate
where h.holdingdate is null
EDIT: Corrected the second version to use a correlated WHERE clause.
insert into holdings (accountid, holdingdate, holdingid, holdingvalue)
select v.accountid, v.valuationdate, 999, v.valuation
from valuations v
where v.valuationdate not in (select distinct holdingdate from holdings where accountid=v.accountid)
答案 1 :(得分:0)
您可以根据日期使用WHERE NOT IN。
INSERT INTO holdings
(accountid, holdingdate, holdingid, holdingvalue)
SELECT accountid, valuationdate, NULL, valuation
FROM valuations
WHERE valuationdate NOT IN (
SELECT holdingdate
FROM holdings
)
我不知道您是否仍然需要Id列和holdingid列。你必须决定如何处理这些。