2017-07-28 13 views
0

Ich habe zwei Tabellen, die durch die folgenden definiert sind:SQL Server: Durchschnittliche Daten aus einer Tabelle Fügeparameter aus einer anderen Tabelle oder Sicht

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 

Ich versuche zu schaffen, eine Ansicht mit 4 Spalten, wo ich sehen kann Überprüfen Sie bei jedem Emittenten die Daten, wann der Emittent zuerst und zuletzt in der Tabelle DailyPortfolio erschien, und den Durchschnittswert NAV aus der Tabelle DailyStats für diese Daten. So sind die ersten drei Spalten dieser Ansicht würde durch definiert werden:

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

Wie kann ich die vierte Spalte hinzufügen, die die AverageNAV mit der NAV Spalte aus der DailyStats Tabelle für den Datumsbereich durch die MIN(Date) und MAX(Date) Spalten definiert berechnet in der Ansicht.

Meine letzte Ansicht sollte wie folgt aussehen:

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 

Antwort

1

Wenn Sie einen CTE verwenden Sie den Datumsbereich von Emittenten zu definieren, können Sie AVG verwenden, um eine individuelle durchschnittliche Basis auf jeden Datumsbereich zu erhalten:

;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 

Hier vollständiger Beispielcode mit Beispieldaten und Ausgang:

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 

Ausgang:

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

Funktioniert gut. Vielen Dank! – MilesToGoBeforeISleep

Verwandte Themen