2017-07-24 27 views
0

我的影片由以下定义的两个表:SQL服务器:对齐数据透视表行

CREATE TABLE Portfolio.DailyStats 
(Date date NOT NULL, 
NAV int NOT NULL, 
SP500 decimal(8,4) NULL, 
R2K decimal(8,4) NULL, 
NetExp decimal(8,4) NULL, 
GrossExp decimal(8,4) NULL,) 
GO 

CREATE TABLE Portfolio.DailyPortfolio 
(BbgID varchar(30) NOT NULL, 
Ticker varchar(22) NULL, 
Cusip char(9) NULL, 
SecurityDescription varchar(50) NOT NULL, 
AssetCategory varchar(25) NOT NULL, 
LSPosition char(3) NULL, 
Ccy varchar(25) NOT NULL, 
Quantity int NULL, 
AvgCost decimal(7,3) NULL, 
PriceLocal decimal(7,3) NULL, 
Cost int NULL, 
MktValNet int NULL, 
GLPeriod int NULL, 
Beta decimal(4,2) NULL, 
BetaExpNet int NULL, 
BetaExpGross int NULL, 
Delta decimal(4,2) NULL, 
DeltaExpNet int NULL, 
DeltaExpGross int NULL, 
Issuer varchar(48) NOT NULL, 
Country varchar(30) NOT NULL, 
Region varchar(20) NOT NULL, 
Sector varchar(30) NOT NULL, 
Industry varchar(48) NOT NULL, 
MktCapCategory varchar(24) NULL, 
MktCapEnd int NULL, 
Date date NOT NULL, 
PortfolioID AS BbgID+LSPosition+ Convert(varchar(8),Date,112) Persisted 
Primary Key) 
GO 

我试图创造一个我可以看看PNL贡献为每间发行机构按年,其中每年表示由一列组成。 PNL贡献定义为该年度每年/ AVG(NAV)的SUM(GLPeriod)。举个例子,我的最终输出应该是这样的:

Issuer| 2015| 2016| 2017| 
:-----|-----|-------|-------| 
Issuer A| -0.012550646| -0.| NULL| 
Issuer B| -0.00701487| -0.000759621| -0.004905285| 
Issuer C| NULL| -0.002270388| -0.003730801| 

而是通过电流输出是这样的:

Issuer| 2015| 2016| 2017| 
:-----|-----|-------|-------| 
Issuer A| NULL| -0.| NULL| 
Issuer A| -0.012550646| NULL| NULL| 
Issuer B| NULL| NULL| -0.004905285| 
Issuer B| NULL| -0.000759621| NULL| 
Issuer B| -0.00701487| NULL| NULL| 
Issuer C| NULL| NULL| -0.003730801| 
Issuer C| NULL| -0.002270388| NULL| 

在这里,我使用的代码:

CREATE VIEW Portfolio.ContributionByYear 
AS 
WITH a 
AS 
(
SELECT Issuer, SUM(GLPeriod) PNL, DATEPART(yyyy, Date) Year 
FROM Portfolio.DailyPortfolio 
GROUP BY Issuer, DATEPART(yyyy, Date) 
) 
, 
b AS 
(
SELECT AVG(CAST(NAV AS BIGINT)) AvgNAV, DATEPART(yyyy, Date) Year 
FROM Portfolio.DailyStats 
GROUP BY DATEPART(yyyy, Date) 
), 
c AS 
(
SELECT a.Issuer, a.PNL, a.Year, b.AvgNAV , CONVERT(decimal (15,3), 
a.PNL)/CONVERT(decimal (15,3), b.AvgNAV) [Contrib] 
FROM a 
JOIN b 
ON a.Year = b.Year 
) 
SELECT Issuer, [2015],[2016],[2017] 
FROM c 
PIVOT 
(
SUM(c.Contrib) 
FOR [Year] IN ([2015],[2016],[2017]) 
) AS PivotTable 
GO 

另一个问题我有这个代码是我在数据透视表中使用SUM聚合函数,但实际上并没有添加任何东西。它只是将数据从行移动到列。但是,我似乎无法在不使用某种聚合函数的情况下调整数据。

回答

1

尝试从c CTE去除a.PNLb.AvgNAV ..

SELECT a.Issuer, a.Year, --here `a.PNL` and `b.AvgNAV` is removed 
     CONVERT(decimal (15,3), a.PNL)/CONVERT(decimal (15,3), b.AvgNAV) [Contrib] 
FROM a 
JOIN b 
ON a.Year = b.Year 

开始到Cte's给予适当的名称,它使代码更易读

CREATE VIEW Portfolio.ContributionByYear 
AS 
WITH cteDailyPortfolio 
AS 
(
SELECT Issuer, SUM(GLPeriod) PNL, DATEPART(yyyy, Date) Year 
FROM Portfolio.DailyPortfolio 
GROUP BY Issuer, DATEPART(yyyy, Date) 
), 
cteDailyStats AS 
(
SELECT AVG(CAST(NAV AS BIGINT)) AvgNAV, DATEPART(yyyy, Date) Year 
FROM Portfolio.DailyStats 
GROUP BY DATEPART(yyyy, Date) 
), 
pivotData AS 
(
SELECT a.Issuer, a.Year, --here `a.PNL` and `b.AvgNAV` is removed 
     CONVERT(decimal (15,3), a.PNL)/CONVERT(decimal (15,3), b.AvgNAV) [Contrib] 
FROM cteDailyPortfolio a 
JOIN cteDailyStats b 
ON a.Year = b.Year 
) 
SELECT Issuer, [2015],[2016],[2017] 
FROM pivotData 
PIVOT 
(
SUM(c.Contrib) 
FOR [Year] IN ([2015],[2016],[2017]) 
) AS PivotTable 
GO 
+0

感谢。不能相信这是多么简单。为什么这两列使用额外的行创建这个问题? – MilesToGoBeforeISleep

+1

@MilesToGoBeforeISleep - 在数据透视源数据中不应该有任何额外的列,否则它会考虑那些也是为了旋转这就是为什么看到'NULL'..你可以选择'a.PNL'和'b.AvgNAV'列在最后'选择'你的情况不需要.. –