2015-05-11 35 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