2016-09-20 67 views
1

SQL新手在這裏。我一直在研究如何使用另一個表中的數據將計算列添加到視圖中,但未能獲得我想要的結果。SQL Server 2012將計算列添加到具有不同數據類型的另一個表的視圖

考慮這樣的觀點:

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語句:

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子句中有查詢。任何建議,以改善這將不勝感激。

謝謝!

+1

從下往上去......你能雖然它不會是性能殺手從where子句中刪除選擇。我假設ReportDate不是Date或DateTime類型?你的兩張桌子之間又有什麼關係? 'DailyStats'和'DailyPortfolioIssuerLS'? – scsimon

+0

ReportDate是Date(yyyy-mm-dd)類型。 'DailyStats'和'DailyPortfolioLS'並沒有真正的聯繫,只是它們都有投資組合的表現編號,但'DailyPortfolioLS'的信息更細化。 – MilesToGoBeforeISleep

回答

1

以下是使用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] 
+0

我得到這個錯誤:列'cteNav.NavBOM'在選擇列表中無效,因爲它不包含在集合函數或GROUP BY子句中。我試圖將該列添加到GROUP BY子句,之後代碼執行但沒有返回任何數據 – MilesToGoBeforeISleep

+0

@MilesToGoBeforeISleep對此抱歉。編輯爲 – scsimon

+0

仍然在[&ofNAV]列中獲得0。我認爲這個問題與數據類型有關。例如,我們將3500人的數字除以3500萬。我懷疑將數據類型轉換爲類似十進制(7,4)將會解決問題 – MilesToGoBeforeISleep

0

感謝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 
相關問題