在单个表/视图上以两种方式进行多部分标识符发布和数据透视

时间:2018-08-09 19:16:57

标签: sql sql-server pivot

我已经在SQL中创建了一个视图,该视图为我提供了以下数据:

+------+--------+--------+------+------+
| Year | Issuer |  PNL   | LgSt | PPNL |
+------+--------+--------+------+------+
| 2017 | a      |  47433 | L    |    1 |
| 2016 | b      | -29250 | S    |    0 |
| 2017 | c      | 211469 | S    |    1 |
| 2016 | d      |   8231 | S    |    1 |
| 2018 | a      |  89679 | S    |    1 |
| 2018 | b      | -34655 | L    |    0 |
| 2017 | b      |  65035 | L    |    1 |
| 2017 | c      | -52719 | L    |    0 |
| 2015 | a      |  11621 | L    |    1 |
+------+--------+--------+------+------+

该视图的代码为:

CREATE VIEW
[Portfolio].[HitRatePretable]
AS
WITH CTE1
AS
(
SELECT DP.Issuer, DP.AssetCategory, SUM (DP.GLPeriod) As [PNL],  
SUM(DP.DeltaExpNet) NetExp, SUM(DP.DeltaExpGross) GrossExp, DP.Date, 
DATEPART (YYYY,DP.date) As [Year]
FROM Portfolio.DailyPortfolio DP 
GROUP BY Issuer,DP.AssetCategory ,DP.Date
)
, 
CTE2
AS
(
SELECT CTE1.Year, CTE1.Issuer, SUM(CTE1.PNL) [PNL], 
CASE 
    WHEN ABS(MAX(CTE1.NetExp)) > ABS(MIN(CTE1.NetExp)) THEN 'L'
    ELSE 'S'
END As [LS]
FROM CTE1
GROUP BY CTE1.Year, CTE1.Issuer
HAVING SUM(CTE1.PNL) >1000
OR SUM(CTE1.PNL)<-1000
)
SELECT CTE2. Year, CTE2.Issuer,CTE2.PNL[PNL],CTE2.LS [LgSt],
CASE
    WHEN CTE2.PNL>0 THEN 1
    ELSE 0
END As [PPNL]
FROM CTE2

我需要根据以下数据创建另一个视图:

+------+---------------+------------+---------------+------------+---------------+------------+---------------+------------+
| LgSt |     2015      | 2015Total  |     2016      | 2016Total  |     2017      | 2017Total  |     2018      | 2018Total  |
+------+---------------+------------+---------------+------------+---------------+------------+---------------+------------+
| L    | Sum of (PPNL) | Count of L | Sum of (PPNL) | Count of L | Sum of (PPNL) | Count of L | Sum of (PPNL) | Count of L |
| S    | Sum of (PPNL) | Count of S | Sum of (PPNL) | Count of S | Sum of (PPNL) | Count of S | Sum of (PPNL) | Count of S |
+------+---------------+------------+---------------+------------+---------------+------------+---------------+------------+

在尝试之前,我尝试做一个更简单的数据透视,以这种格式返回数据:

+------+---------------+---------------+---------------+---------------+
| LgSt |     2015      |     2016      |     2017      |     2018      |
+------+---------------+---------------+---------------+---------------+
| L    | Sum of (PPNL) | Sum of (PPNL) | Sum of (PPNL) | Sum of (PPNL) |
| S    | Sum of (PPNL) | Sum of (PPNL) | Sum of (PPNL) | Sum of (PPNL) |
+------+---------------+---------------+---------------+---------------+

我的简单枢纽代码为:

select HR.LgSt, [2015],[2016],[2017],[2018]
from portfolio.HitRatePretable HR
Pivot
(
SUM (PPNL) FOR LgSt IN
( [2015],[2016],[2017],[2018])
) AS pvt

这返回了以下错误:

消息4104,第16级,状态1,第1行 无法绑定多部分标识符“ HR.LgSt”。

我的问题是:

  1. 为什么会出现该错误?
  2. 如何使用“总计”列创建视图?

谢谢。

2 个答案:

答案 0 :(得分:2)

要获得SUM和总计,我将在以下单个查询中使用CASE

select LgSt, 
SUM(CASE WHEN YEAR=2015 THEN PPNL ELSE 0 END) as [2015],
SUM(CASE WHEN YEAR=2015 THEN 1 ELSE 0 END) as [2015]Total, 
SUM(CASE WHEN YEAR=2016 THEN PPNL ELSE 0 END) as [2016],
SUM(CASE WHEN YEAR=2016 THEN 1 ELSE 0 END) as [2016]Total,
SUM(CASE WHEN YEAR=2017 THEN PPNL ELSE 0 END) as [2017],
SUM(CASE WHEN YEAR=2017 THEN 1 ELSE 0 END) as [2017]Total,
SUM(CASE WHEN YEAR=2018 THEN PPNL ELSE 0 END) as [2018],
SUM(CASE WHEN YEAR=2018 THEN 1 ELSE 0 END) as [2018]Total
from portfolio.HitRatePretable HR
Group by LgSt

答案 1 :(得分:1)

尝试:

select pvt.LgSt, [2015],[2016],[2017],[2018]
from portfolio.HitRatePretable HR
Pivot
(
SUM (PPNL) FOR Year IN
( [2015],[2016],[2017],[2018])
) AS pvt

您要关注Year,而不是LgSt