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

Mysql SQL选择投资组合中的持股集中度,mysql,sql,Mysql,Sql,我有一个由两个表组成的模式,clients和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 控股公司 id int AUTO_INCREMENT

我有一个由两个表组成的模式,
clients
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
控股公司

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
我如何选择某一特定持股在该日期构成其客户投资组合的比例

例如,如果客户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来帮助可视化场景,并用示例数据填充它:

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

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;
我还修复了
客户
控股
之间的连接。
on
条件应提及两个表


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

是否需要为表名别名?
h.*
h2.*
是如何工作的?@harryg。您需要为表名添加别名。这就是
h
h2
的含义。