Select
使用連接標量表的結果創建視圖
我真的不擅長 SQL 查詢,而且似乎陷入了一個非常奇怪的問題。也許有這樣做的替代方案,但我根本無法弄清楚。也許你們可以幫忙!
所以,這是我的目標:我需要顯示過去 12 個月的趨勢圖,並且我需要從現有的表中生成一個視圖,該表有兩列:月+年和計數。所以它會像“Jul-2014 97”這樣的記錄。
我嘗試了以下方法,首先創建一個標量表,其中包含過去 12 個月的月+年組合,例如“Jul-2014”等。其次,我創建另一個標量表,其中包含“月+年”和“計數”組合,例如“ 2014 年 7 月 97"。問題是第二個表將沒有過去 12 個月的所有數據。所以我正在做一個 LEFT OUTER JOIN 來獲取所有月+年數據。
我的查詢如下:
DECLARE @MonthYears TABLE (LNo INT IDENTITY(1,1), Name Varchar(50)) DECLARE @MonthYearsData TABLE (Yr INT, Mon INT, MonYr varchar(50), CrCount INT) SET LANGUAGE English; WITH R(N) AS ( SELECT 0 UNION ALL SELECT N+1 FROM R WHERE N < 12 ) INSERT INTO @MonthYears (Name) SELECT LEFT(DATENAME(MONTH,DATEADD(MONTH,-N,GETDATE())),3) + '-' + CAST(DATEPART(YEAR,DATEADD(MONTH,-N,GETDATE())) as varchar(10)) AS Last12Mon FROM R INSERT INTO @MonthYearsData(Yr, Mon, MonYr, CrCount) SELECT YEAR(RequestedOn), MONTH(RequestedOn), SUBSTRING(DateName( month , DateAdd( month , MONTH(RequestedOn) , 0 ) - 1 ),1,3) + '-' + CAST(YEAR(RequestedOn) as varchar(10)) as MonYr, count(*) FROM TempTableTest WHERE RequestedOn >= DATEADD(MONTH, -13, GETDATE()) GROUP BY YEAR(RequestedOn), MONTH(RequestedOn) SELECT M.Name, ISNULL(N.CrCount,0) as CRCount FROM @MonthYears M left outer join @MonthYearsData N ON M.Name = N.MonYr GROUP BY M.Name, N.CrCount, M.LNo ORDER BY M.LNo DESC
所以,我收到如下回复:
Name CRCount Dec-2013 0 Jan-2014 0 Feb-2014 0 Mar-2014 0 Apr-2014 0 May-2014 0 Jun-2014 0 Jul-2014 0 Aug-2014 1 Sep-2014 0 Oct-2014 0 Nov-2014 0 Dec-2014 2
現在我需要在視圖中使用它,這樣我就可以在我的報告工具中使用它。但是,我無法使用這種標量表方法創建一個。即使是臨時表也失敗了。我真的陷入了僵局。有人可以指出一種方法嗎?
PS:我嘗試在最後一個 SELECT 查詢中動態創建標量表,但沒有任何運氣。
提前致謝!
您是否嘗試將您的
WITH
陳述連結在一起?注意 這可能不是解決此問題的最佳方法,但應該根據您現有的方法工作
CREATE VIEW dbo.MyViewName AS WITH R(N) AS ( SELECT 0 UNION ALL SELECT N+1 FROM R WHERE N < 12 ), MonthYears AS ( SELECT LEFT(DATENAME(MONTH,DATEADD(MONTH,-N,GETDATE())),3) + '-' + CAST(DATEPART(YEAR,DATEADD(MONTH,-N,GETDATE())) as varchar(10)) AS Name FROM R ), MonthYearsData AS ( SELECT YEAR(RequestedOn) Yr, MONTH(RequestedOn) Mon, SUBSTRING(DateName( month , DateAdd( month , MONTH(RequestedOn) , 0 ) - 1 ),1,3) + '-' + CAST(YEAR(RequestedOn) as varchar(10)) as MonYr, count(*) CrCount FROM TempTableTest WHERE RequestedOn >= DATEADD(MONTH, -13, GETDATE()) GROUP BY YEAR(RequestedOn), MONTH(RequestedOn) ) SELECT M.Name, ISNULL(N.CrCount,0) as CRCount FROM MonthYears M left outer join MonthYearsData N ON M.Name = N.MonYr GROUP BY M.Name, N.CrCount, M.LNo ORDER BY M.LNo DESC;