我已经在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”。
我的问题是:
谢谢。
答案 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