2015-05-11 34 views
0

我有一張表,其中包含某些日期的股票及其權重列表。我想要做的是在兩個不同的日期選擇屬於投資組合的股票,並比較權重。下面簡單的例子,比較同一表中的記錄並計算不同日期的差異

Date 1st March 2015    Date 1st May 2015 
Stock Name Weight    Stock Name Weight 
ABC   20     MNO   30 
DEF   15     XYZ   25 
MNO   40     LMN   30 
LMN   25     PPP   10 
           KLM   5 
           ABC   20 

結果我想

Stock Name Weight Change 
ABC   0 
DEF   -15 
MNO   -10 
LMN   5 
PPP   10 
KLM   5 
XYZ   25 

這是我到目前爲止這是不是很接近我所需要的!

with t0 as 
(select * from PORT_WGT 
and port_name = 'My Port' 
and wgt <> 0 
and pricedate = '2015-01-02'), 
t1 as 
(select * from PORT_WGT 
where counterparty = 'JPM' 
and port_name = 'My Port' 
and wgt <> 0 
and pricedate = '2015-01-30') 
select * from t0 union all 
select * from t1 

更新

剛剛意識到我是使用了錯誤類型的連接,請參閱我的更新查詢。我只需要計算權重

with t0 as 
(select * from PORT_WGT 
where port_name = 'My Port' 
and wgt <> 0 
and pricedate = '2015-01-02'), 
t1 as 
(select * from PORT_WGT 
where port_name = 'My Port' 
and wgt <> 0 
and pricedate = '2015-01-30') 
select coalesce(t0.sedol, t1.sedol), coalesce(t0.co_name, t1.co_name) from  t0 full outer join t1 on t0.sedolchk = t1.sedolchk 

回答

4

我認爲你需要2個熱膨脹係數之間的FULL OUTER JOIN的變化:

;WITH t0 AS (
    SELECT * 
    FROM PORT_WGT 
    WHERE counterparty = 'JPM' 
     and port_name = 'My Port' 
     and wgt <> 0 
     and pricedate = '2015-01-02' 
), t1 as (
    SELECT * 
    FROM PORT_WGT 
    WHERE counterparty = 'JPM' 
     and port_name = 'My Port' 
     and wgt <> 0 
     and pricedate = '2015-01-30') 
SELECT COALESCE(t0.[Stock Name], t1.[Stock Name]) AS [Stock Name], 
     COALESCE(t1.Weight, 0) - COALESCE(t0.Weight, 0) AS WeightChange 
FROM t0 
FULL OUTER JOIN t1 ON t0.[Stock Name] = t1.[Stock Name] 
ORDER BY [Stock Name] 

SQL Fiddle Demo

您也可以使用條件聚集

select [Stock Name], 
     SUM(CASE WHEN pricedate = '2015-01-30' THEN Weight 
       ELSE 0 
      END) 
     - 
     SUM(CASE WHEN pricedate = '2015-01-02' THEN Weight 
       ELSE 0 
      END) AS WeightChange 
from PORT_WGT 
where counterparty = 'JPM' and port_name = 'My Port' and wgt <> 0 
     and (pricedate = '2015-01-02' OR pricedate = '2015-01-30') 
group by [Stock Name] 

SQL Fiddle Demo

+0

對不起Giorgos我剛纔意識到,上面的查詢確實可行,但每行都會出現兩次。你知道如何解決這個問題嗎? – mHelpMe

+1

@mHelpMe那麼,您提供的示例數據所涉及的問題是不可重現的。您還可以檢查我所做的編輯,提供替代解決方案。你能設置一個sqlfiddle來證明這個問題嗎? –

+0

你的權利它確實與我的簡單示例一起工作,而不是與我的實際數據。需要考慮導致行被複制的原因 – mHelpMe