[英]SQL Server: Joining Average Data from a table using parameters from another table or view
I have two tables that's defined by the following: 我有以下定义的两个表:
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
I am trying to create a view with 4 columns where I can see every Issuer, look at the dates when the Issuer appeared first and last in the DailyPortfolio
table and the average NAV
from the DailyStats
table for those dates. 我试图创建一个4列在那里我可以看到每一个发行人,看日期时,发行人出现了第一个和最后在一个视图DailyPortfolio
表,平均NAV
从DailyStats
表的日期。 So the first three columns of this view would be defined by: 因此,此视图的前三列将通过以下方式定义:
SELECT
Issuer, MIN(Date) OpenDate, MAX(Date) CloseDate
FROM
Portfolio.DailyPortfolio
GROUP BY
Issuer
How do I add the fourth column that calculates the AverageNAV
using the NAV
column from the DailyStats
table for the date range defined by the MIN(Date)
and MAX(Date)
columns in the view. 如何添加计算的第四列AverageNAV
使用NAV
从列DailyStats
表由定义的日期范围MIN(Date)
和MAX(Date)
视图中的列。
My final view should look something like this: 我的最终视图应如下所示:
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
If you use a CTE to define the date range by issuer, you can use AVG to get an individual average base on each date range: 如果使用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
Here's full example code with sample data and output: 这是带有示例数据和输出的完整示例代码:
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
Output: 输出:
Issuer OpenDate CloseDate AverageNAV
Max 2017-01-01 2017-04-01 300
Scott 2015-01-01 2017-04-01 250
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.