SQL选择投资组合中的持股集中度

时间:2014-11-24 11:38:22

标签: mysql sql

我有一个由2个表clientsholdings组成的模式。 holdings包含某个特定客户在某个日期的投资组合。

客户端

id int AUTO_INCREMENT   PRIMARY KEY,
name varchar(30)

控股

id int AUTO_INCREMENT   PRIMARY KEY,
client_id int,
holding varchar(80),
value decimal(6,2),
holding_date DATE

如何在该日期选择特定持有人在其客户的投资组合中所占的比例?

E.g。如果客户1在2014-11-30的投资组合中有3个持股(持有1,2,3),分别为80,80和40,那么他们将分别占40%,40%和20%。我遇到的问题是得到除数,即某某客户在特定日期的所有持股的总和。我认为需要一个子查询,但我很难形成子查询。

我尝试了类似

的内容
SELECT clients.name, holdings.name, sum(holdings.value) / (SELECT sum(holdings.value) WHERE holdings.date = '2014-11-30' AND ...) -- how do I get the conditions in the subquery
FROM clients LEFT JOIN holdings ON holdings.id = holdings.client_id
WHERE holdings.date = '2014-11-30'
GROUP BY clients.name, holdings.name

我已经制作了一个sqlfiddle来帮助可视化场景并用样本数据填充它:http://sqlfiddle.com/#!2/2083d

1 个答案:

答案 0 :(得分:1)

您需要聚合数据并将结果重新加入。在您的情况下,您希望使用看起来像这样的相关子查询来执行此操作:

SELECT c.name, h.name,
       sum(h.value) / (SELECT nullif(sum(h2.value), 0)
                       FROM holdings h2
                       WHERE h2.date = h.date AND
                             h2.client_id = h.client_id
                      ) -- how do I get the conditions in the subquery
FROM clients c LEFT JOIN
     holdings h
     ON c.id = h.client_id
WHERE h.date = '2014-11-30'
GROUP BY c.name, h.name;

我还修复了clientsholdings之间的联接。 on条件应该提到两个表。

如果持有的值可能为零,我添加了NULLIF()函数以防止被零除。