我有一个由2个表clients
和holdings
组成的模式。 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
答案 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;
我还修复了clients
和holdings
之间的联接。 on
条件应该提到两个表。
如果持有的值可能为零,我添加了NULLIF()
函数以防止被零除。