简体   繁体   English

SQL Server:使用另一个表或视图中的参数联接表中的平均数据

[英]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表,平均NAVDailyStats表的日期。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM