2017-07-28 112 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, 
    DeltaExpNet int NULL, 
    Issuer varchar(48) NOT NULL, 
    Date date NOT NULL, 
    PortfolioID AS BbgID + LSPosition + Convert(varchar(8), Date, 112) Persisted Primary Key 
) 
GO 

我試圖創建一個4列的觀點,我可以看到每個發行人,請查看發行人在DailyPortfolio表中的首次出現和最後出現的日期以及這些日期的DailyStats表中的平均值NAV

SELECT 
    Issuer, MIN(Date) OpenDate, MAX(Date) CloseDate 
FROM 
    Portfolio.DailyPortfolio 
GROUP BY 
    Issuer 

如何添加,使用NAV列從DailyStats表由MIN(Date)MAX(Date)列定義的日期範圍計算AverageNAV第四列:所以這個觀點的前三列將被定義在視圖中。

我最後的觀點應該是這個樣子:

Issuer OpenDate CloseDate AverageNAV 
:------|-----------|-----------|----------: 
Issuer A 2/4/2015 11/9/2016 28234164 
Issuer B 2/6/2015 5/19/2017 30446780 
Issuer C 11/19/2015 10/11/2016 35789424 

回答

1

如果使用CTE來定義發行日期範圍,您可以使用AVG在每個日期範圍內獲得的個人平均基地:

;WITH DateRange AS(
SELECT DP.Issuer, MIN(DP.Date) OpenDate, MAX(DP.Date) CloseDate 
FROM Portfolio.DailyPortfolio DP 
GROUP BY DP.Issuer 
) 
SELECT DR.Issuer, DR.OpenDate, DR.CloseDate, AVG(DS.NAV) AS AverageNAV 
FROM DateRange DR 
INNER JOIN Portfolio.DailyStats DS ON DS.Date BETWEEN DR.OpenDate AND DR.CloseDate 
GROUP BY DR.Issuer, DR.OpenDate, DR.CloseDate 

下面是與採樣數據和輸出完整的例子的代碼:

DECLARE @DailyStats TABLE 
(Date DATE NOT NULL, 
NAV INT NOT NULL) 

DECLARE @DailyPortfolio TABLE 
(Issuer VARCHAR(48) NOT NULL, 
Date DATE NOT NULL) 

INSERT INTO @DailyPortfolio VALUES ('Max', '1/1/2017') 
INSERT INTO @DailyPortfolio VALUES ('Max', '2/1/2017') 
INSERT INTO @DailyPortfolio VALUES ('Max', '3/1/2017') 
INSERT INTO @DailyPortfolio VALUES ('Max', '4/1/2017') 
INSERT INTO @DailyPortfolio VALUES ('Scott', '1/1/2015') 
INSERT INTO @DailyPortfolio VALUES ('Scott', '2/1/2017') 
INSERT INTO @DailyPortfolio VALUES ('Scott', '3/1/2017') 
INSERT INTO @DailyPortfolio VALUES ('Scott', '4/1/2017') 

INSERT INTO @DailyStats VALUES ('1/1/2016', 100) 
INSERT INTO @DailyStats VALUES ('2/1/2017', 200) 
INSERT INTO @DailyStats VALUES ('3/1/2017', 300) 
INSERT INTO @DailyStats VALUES ('3/3/2017', 400) 

;WITH DateRange AS(
SELECT DP.Issuer, MIN(DP.Date) OpenDate, MAX(DP.Date) CloseDate 
FROM @DailyPortfolio DP 
GROUP BY DP.Issuer 
) 
SELECT DR.Issuer, DR.OpenDate, DR.CloseDate, AVG(DS.NAV) AS AverageNAV 
FROM DateRange DR 
INNER JOIN @DailyStats DS ON DS.Date BETWEEN DR.OpenDate AND DR.CloseDate 
GROUP BY DR.Issuer, DR.OpenDate, DR.CloseDate 

輸出:

Issuer OpenDate CloseDate AverageNAV 
Max  2017-01-01 2017-04-01 300 
Scott 2015-01-01 2017-04-01 250 
+0

工程很好。謝謝! – MilesToGoBeforeISleep

相關問題