2017-10-13 98 views
0

如果這是重複的道歉,但我的場景對於提供的示例非常具體。SQL中的PIVOT返回可能不需要的行作爲NULL

這個PIVOT邏輯導致它返回所有不需要的空值而不是僅返回需要的列的1行有什麼問題。 (被它太長主演。)

SELECT ENTITY_VAL, [12],[11],[10],[9],[8],[7],[6],[5],[4],[3],[2],[1] 
    FROM 
    (
    SELECT ROW_NUMBER() OVER(ORDER BY CONVERT(DATE, DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, D) + 1, 0)),121) DESC) ID 
    ,DATEPART(YEAR, D) YR 
    ,DATEPART(MONTH, D) MNTH 
    --,RIGHT('00' + CAST(DATEPART(mm, D) AS VARCHAR(02)), 2) MNTH2 
    ,CONVERT(DATE, D, 101) FIRSTOFMONTH 
    ,CONVERT(DATE, DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, D) + 1, 0)),121) LASTOFMONTH 
    , 1111111 ENTITY_VAL 
    FROM 
     (
      SELECT D = DATEADD(MONTH, XM.RN, @StartDate) 
      FROM 
      (
      SELECT TOP (DATEDIFF(MONTH, @StartDate, @CutoffDate)) 
       RN = ROW_NUMBER() OVER (ORDER BY AO.[object_id]) 
      FROM sys.all_objects AS AO 
      CROSS JOIN sys.all_objects AS AO2 
      -- on my system this would support > 5 million days 
      ORDER BY AO.[object_id] 
     ) AS XM 
     ) AS XY 
    --ORDER BY LASTOFMONTH ASC 
    ) AS BASE 
    PIVOT 
    (
     MAX(FIRSTOFMONTH) FOR ID IN ([12],[11],[10],[9],[8],[7],[6],[5],[4],[3],[2],[1]) 
    ) AS PVT 

我得到這個(不是我想要的):

ENTITY_VAL 12   11   10   9   8   7   6   5   4   3   2   1 
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
1111111  2016-11-01 NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL 
1111111  NULL  2016-12-01 NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL 
1111111  NULL  NULL  2017-01-01 NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL 
1111111  NULL  NULL  NULL  2017-02-01 NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL 
1111111  NULL  NULL  NULL  NULL  2017-03-01 NULL  NULL  NULL  NULL  NULL  NULL  NULL 
1111111  NULL  NULL  NULL  NULL  NULL  2017-04-01 NULL  NULL  NULL  NULL  NULL  NULL 
1111111  NULL  NULL  NULL  NULL  NULL  NULL  2017-05-01 NULL  NULL  NULL  NULL  NULL 
1111111  NULL  NULL  NULL  NULL  NULL  NULL  NULL  2017-06-01 NULL  NULL  NULL  NULL 
1111111  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  2017-07-01 NULL  NULL  NULL 
1111111  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  2017-08-01 NULL  NULL 
1111111  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  2017-09-01 NULL 
1111111  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL  2017-10-01 

取而代之的是(什麼我想):

ENTITY_VAL 12   11   10   9   8   7   6   5   4   3   2   1 
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
1111111  2016-11-01 2016-12-01 2017-01-01 2017-02-01 2017-03-01 2017-04-01 2017-05-01 2017-06-01 2017-07-01 2017-08-01 2017-09-01 2017-10-01 
+1

我不會調試代碼。但是樞紐是直截了當的。您將數據轉換爲格式並轉換爲數據透視格式。所以我建議你調試你的子查詢,以確保數據的格式正確。同時簡化代碼並測試每個小部分。檢查[手動](https://technet.microsoft.com/es-es/library/ms177410(v = sql.105).aspx) –

+0

您是否看到過該示例?將'BASE'重寫爲CTE並執行'SELECT * FROM BASE' –

+0

對您的評論進行洞察,別名無關緊要,也不需要*,因爲它看起來不會從正在嘗試的內容顯示。 但是我非常感謝你給我提供「小部分分離」的想法。 –

回答

0

我修正了它,這是過度的列「膨脹」PIVOT。

更新邏輯:

SELECT ENTITY_VAL, [12],[11],[10],[9],[8],[7],[6],[5],[4],[3],[2],[1] 
    FROM 
    (
    SELECT ROW_NUMBER() OVER(ORDER BY CONVERT(DATE, DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, D) + 1, 0)),121) DESC) ID   
    ,CONVERT(DATE, D, 101) FIRSTOFMONTH 
    ,1111111 ENTITY_VAL 
    FROM 
     (
      SELECT D = DATEADD(MONTH, XM.RN, @StartDate) 
      FROM 
      (
      SELECT TOP (DATEDIFF(MONTH, @StartDate, @CutoffDate)) 
       RN = ROW_NUMBER() OVER (ORDER BY AO.[object_id]) 
      FROM sys.all_objects AS AO 
      CROSS JOIN sys.all_objects AS AO2 
      -- on my system this would support > 5 million days 
      ORDER BY AO.[object_id] 
     ) AS XM 
     ) AS XY 
    --ORDER BY LASTOFMONTH ASC 
    ) AS BASE 
    PIVOT 
    (
     MAX(FIRSTOFMONTH) FOR ID IN ([12],[11],[10],[9],[8],[7],[6],[5],[4],[3],[2],[1]) 
    ) AS PVT 

將返回:

ENTITY_VAL 12   11   10   9   8   7   6   5   4   3   2   1 
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
1111111  2016-11-01 2016-12-01 2017-01-01 2017-02-01 2017-03-01 2017-04-01 2017-05-01 2017-06-01 2017-07-01 2017-08-01 2017-09-01 2017-10-01