构造一个SQL查询,以使用另一个表中的数据填充一个表

时间:2013-08-01 08:55:17

标签: sql ms-access

对于有SQL经验的人来说这是一个挑战(在这种情况下是MS-Access)

我有2个表:holdingsvaluations


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查询来实现上述目标?

2 个答案:

答案 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列。你必须决定如何处理这些。