2014-11-24 33 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