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
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