SQL Server 2012 将计算列添加到来自另一个具有不同数据类型的 table 的视图

SQL Server 2012 Adding a computed column to a view from another table with different data types

SQL 这里是新手。我一直在研究如何将计算列添加到包含来自另一个 table 的数据的视图,但一直无法获得我想要的结果。

考虑这个观点:

CREATE VIEW [Portfolio].[MTDPNL]
AS
SELECT IssuerLS, Issuer, Ticker, SUM (GLPeriod) As [PNL], ReportDate
FROM Portfolio.DailyPortfolioIssuerLS
WHERE ReportDate 
BETWEEN 
(SELECT CONVERT(CHAR(10),DATEADD(dd,-(DAY(GetDate())-1),GetDate()), 120)) 
AND  
(SELECT CONVERT(CHAR(10),(getdate()),120))
GROUP BY Issuer, Ticker, IssuerLS, ReportDate

现在考虑这个 SELECT 语句,其中 returns 是一个整数值:

SELECT Nav AS [NavBOM]
FROM Portfolio.DailyStats ds
WHERE Date = (SELECT CONVERT(CHAR(10),DATEADD(dd,-(DAY(GetDate())-1),GetDate()), 120))

我想在我的视图中添加一列 PNL/NavBom。换句话说,对于我认为的每一行,我想添加一列,将 PNL 列中的数字作为分子并将其除以 NavBOM 数字(因此每一行的分母都相同)

我一直在用下面的代码进行测试:

SELECT IssuerLS, Issuer, Ticker, SUM (GLPeriod) As [PNL], ReportDate, 
    CAST(SUM (GLPeriod)/(SELECT Nav AS NavBOM
    FROM Portfolio.DailyStats ds
    WHERE Date = (SELECT CONVERT(CHAR(10),DATEADD(dd,-(DAY(GetDate())-1),GetDate()), 120))) 
    AS Decimal (7,4)) AS[%ofNAV]

FROM Portfolio.DailyPortfolioIssuerLS

WHERE ReportDate BETWEEN 
    (SELECT CONVERT(CHAR(10),DATEADD(dd,-(DAY(GetDate())-1),GetDate()),120)) 
    AND  
    (SELECT CONVERT(CHAR(10),(getdate()),120))
GROUP BY Issuer, Ticker, IssuerLS, ReportDate

我不确定问题出在哪里,但我在每一行的 [%ofNAV] 列中得到的值为 0.0000。 NavBOM 和 PNL 都是整数数据类型。并且由于 NavBOM 与 PNL 相比要大得多,我需要将其转换为十进制。

此外,我创建的原始视图需要将近 4 秒才能执行。可能是因为我的 WHERE 子句中有查询。任何改进建议将不胜感激。

谢谢!

这是使用 CTE 获取 NavBOM 然后在视图创建中使用它的方法。

CREATE VIEW [Portfolio].[MTDPNL]
AS
WITH cteNav as(
SELECT Nav AS [NavBOM]
FROM Portfolio.DailyStats ds
WHERE Portfolio.Date = DATEADD(dd,-(DAY(GetDate())-1),GetDate()))

SELECT 
    IssuerLS, 
    Issuer, 
    Ticker, 
    SUM (GLPeriod) As [PNL],
    SUM(CONVERT(DECIMAL(15,2),GLPeriod)) /  CONVERT(DECIMAL(15,2),cteNav.[NavBOM]) as [%ofNAV]
    ReportDate
FROM Portfolio.DailyPortfolioIssuerLS
JOIN cteNav on 1=1
WHERE ReportDate BETWEEN  CONVERT(DATE,DATEADD(dd,-(DAY(GetDate())-1),GetDate())) AND getdate()   --interesting way to get the first day of the month BTW
GROUP BY 
    Issuer, Ticker, IssuerLS, ReportDate, cteNav.[NavBOM]

感谢 scsimon,代码稍作调整即可运行:

WITH cteNav as(
SELECT Nav AS [NavBOM]
FROM Portfolio.DailyStats ds
WHERE ds.Date = CONVERT(DATE,DATEADD(dd,-(DAY(GetDate())-1),GetDate())))


SELECT IssuerLS, Issuer, Ticker,  SUM (GLPeriod) As [PNL],
CAST(SUM(GLPeriod)As Decimal (12,2)) /  CAST(cteNav.[NavBOM] As Decimal (12,2)) as [%ofNAV], ReportDate
FROM Portfolio.DailyPortfolioIssuerLS ls
JOIN cteNav on 1=1
WHERE ReportDate 
BETWEEN  
CONVERT(DATE,DATEADD(dd,-(DAY(GetDate())-1),GetDate())) 
AND 
CONVERT(CHAR(10),(getdate()),120)  
GROUP BY Issuer, Ticker, IssuerLS, ReportDate, cteNav.[NavBOM]
GO