2015-10-06 30 views
0

我想修改腳本以始終返回12行。問題是,如果只有幾條記錄,它只會顯示Oct和一個值。我使用這些數據來填充圖表,所以如果沒有數據我想顯示Jan 1,Feb 2等等,任何想法的人?強制數據透視表總是返回12行,代表12個月,而不管可用數據多少

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(year(TransactionDateTime)) 
      FROM Quotations 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 

SET @query = 
    'SELECT [month], ' + @Cols + ' 
    FROM (
     SELECT 
      left(datename(month,TransactionDateTime),3) as [month], 
      datepart(month,TransactionDateTime) as [monthNum], 
      year(TransactionDateTime) as [year], 
      isnull(count(*),0) as Total 
     FROM quotations 
     group by left(datename(month,TransactionDateTime),3), datepart(month,TransactionDateTime), year(TransactionDateTime) 
    ) as s 
    PIVOT 
    (
     SUM(Total) 
     FOR [year] IN (' + @cols + ') 
    ) AS QuotationResults 
    ORDER BY QuotationResults.MonthNum;'; 

EXECUTE(@query); 

So if I only have 1 record in table I get one row but I want 12 rows the rest with 0

+0

你能提供的樣本數據和預期的結果? –

+0

所以我得到一行,如果只有1個記錄在表中,但我想要11更多的行顯示0. – John

+0

這是不可用的,你可以至少從'報價表'張貼日期嗎? –

回答

1

您需要創建首先一個月,一年的組合,然後做一個LEFT JOINQuotations表來實現所期望的結果:

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(year(TransactionDateTime)) 
      FROM Quotations 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 

SET @query = 
    'SELECT [month], ' + @Cols + ' 
    FROM (
     SELECT 
      t.[month], 
      t.m AS [monthNum], 
      t.y AS [year], 
      ISNULL(COUNT(q.TransactionDateTime), 0) AS Total 
     FROM (
      SELECT 
       m = m.N, 
       y = y.N, 
       [month] = LEFT(DATENAME(MONTH, DATEADD(MONTH, m.N-1, DATEADD(YEAR, y.N-1900, 0))), 3) 
      FROM (VALUES 
       (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12) 
      )m(N) 
      CROSS JOIN(
       SELECT DISTINCT 
        YEAR(TransactionDateTime) AS N 
       FROM Quotations 
      )y 
     )t 
     LEFT JOIN Quotations q 
      ON YEAR(q.TransactionDateTime) = t.y 
      AND MONTH(q.TransactionDateTime) = t.m 
     GROUP BY 
      t.month, t.m, t.y 
    ) AS S 
    PIVOT 
    (
     SUM(Total) 
     FOR [year] IN (' + @cols + ') 
    ) AS QuotationResults 
    ORDER BY QuotationResults.MonthNum;'; 


EXECUTE(@query);