mHe*_*pMe 0 sql sql-server sql-server-2012
我有一个表,其中包含某些日期的股票及其权重列表.我想做的是在两个不同的日期选择属于投资组合的股票并比较权重.简单的例子如下,
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
Run Code Online (Sandbox Code Playgroud)
结果我想
Stock Name Weight Change
ABC 0
DEF -15
MNO -10
LMN 5
PPP 10
KLM 5
XYZ 25
Run Code Online (Sandbox Code Playgroud)
到目前为止,这就是我所需要的一切!
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
Run Code Online (Sandbox Code Playgroud)
更新
刚刚意识到我使用了错误的连接类型,请查看我更新的查询.我只需要计算权重的变化
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
Run Code Online (Sandbox Code Playgroud)
我认为你需要FULL OUTER JOIN
两个CTE之间:
;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]
Run Code Online (Sandbox Code Playgroud)
您也可以使用条件聚合:
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]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
591 次 |
最近记录: |