Select

使用連接標量表的結果創建視圖

  • December 23, 2014

我真的不擅長 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;

引用自:https://dba.stackexchange.com/questions/86842