2

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

我有 2 张桌子:holdingsvaluations.


holdings包含特定账户在给定日期持有的所有资产及其各自的价值。这些是字段:

id{primary key/auto-inc}, accountid{int}, holdingdate{date}, holdingid{int}, holdingvalue{double}

valuations包含特定账户在给定日期持有的总和。这些是字段:

id{主键/auto-inc}、accountid{int}、valuationdate{date}、valuation{double}。


2012 年 1 月后,对于表中的每一个,我valuationvaluations表中都有相应的持股集合,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 查询来实现上述目的?

4

2 回答 2

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)
于 2013-08-01T09:29:51.040 回答
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 列。你必须决定如何处理这些。

于 2013-08-01T09:19:33.137 回答