2014-11-24 31 views
0

我有一个由2个表格组成的模式,clientsholdingsholdings包含特定日期某个客户的投资组合持有。SQL选择投资组合持股的集中度

客户

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

您需要汇总数据,并加入结果返回。在你的情况,你想用一个相关子查询,将是这样做的:

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; 

我也固定之间的连接和holdingson条件应该提及两个表。

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

+0

我需要别名表名吗? 'h。*'和'h2。*'如何工作? – harryg 2014-11-24 11:55:44

+0

啊,我知道你已经把他们诬蔑了...... – harryg 2014-11-24 12:30:12

+0

@harryg。 。 。你需要别名表名。这就是'h'和'h2'。 – 2014-11-24 12:30:15