2016-07-28 111 views
0

我正在使用SQL Server 2014.我正在使用返回表的存儲過程。SQL Server Dynamic Pivot:刪除完全NULL列

我們有兩個輸入參數@from和@until,它們定義我們將要搜索的日期範圍的開始和結束。

在查詢結束時,我們使用PIVOT將列變爲行。

我能夠正確選擇數據,但在PIVOT後有一個問題: 許多列完全返回NULL,因爲它們未包含在由@from和@until設置的日期範圍中。

我該怎麼做才能根本沒有得到那些NULL列?

這裏是我的代碼:

ALTER PROCEDURE [dbo].[presupuestosVenta] 
    @from char(8), (in this case 201501) 
    @until char(8) (in this case 201506) 
AS 
BEGIN 
    SET NOCOUNT ON; 

DECLARE @venta TABLE 
(
    LAPSO_DOC CHAR(6), 
    ID_EXT_ITM CHAR(3), 
    ID_TALLA CHAR(6), 
    VENTA INT 
) 

INSERT INTO @venta 
SELECT 
    LAPSO_DOC, 
    ID_EXT_ITM, 
    ID_TALLA, 
    CAST (CANTIDAD_CAP AS INT) AS VENTA 
FROM dbo.a_presupuestosVenta 
WHERE 
( ID_REFER = '312177000' 
    OR ID_REFER = '314001000' 
    OR ID_REFER = '315099000' 
) 
AND LAPSO_DOC BETWEEN @from AND @until 

SELECT * 
FROM @venta 
PIVOT 
(
    SUM(VENTA) 
    FOR LAPSO_DOC 
    IN ([201501],[201502], [201503], [201504],[201505], [201506]) 
) 
AS PivotTable 
ORDER BY ID_EXT_ITM DESC, ID_TALLA ASC 
END 

下面是我得到的結果:

sql results

編輯:我一直工作在動態PIVOT查詢,但不斷收到錯誤說我的表@venta沒有定義:

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); 
    SET @columns = N''; 

    SELECT @columns += N', v.' + QUOTENAME(LAPSO_DOC) 
    FROM (SELECT v.LAPSO_DOC FROM @venta AS v 
    GROUP BY v.LAPSO_DOC) AS x; 
    SET @sql = N' 
    SELECT ' + STUFF(@columns, 1, 2, '') + ' 
    FROM 
    (
     SELECT v.VENTA, v.LAPSO_DOC 
     FROM @venta as v 
) AS j 
PIVOT 
(
    SUM(VENTA) FOR LAPSO_DOC IN (' 
    + STUFF(REPLACE(@columns, ', v.[', ',['), 1, 1, '') 
    + ') 
) AS v;'; 
PRINT @sql; 
EXEC sp_executesql @sql; 
+0

這是實際的代碼嗎?如果是這樣,你如何確定你的樞軸聲明中的IN子句?該過程顯示'@ from' AND'@ until'作爲參數傳入,但IN子句硬編碼。它看起來像你需要構建動態sql來生成IN子句。在這種情況下,您可以在構建sql時選擇唯一的LAPSO_DOC值。喬的回答下面有一個關於構建動態數據透視的更多細節的鏈接。 –

+0

是的,它們目前是硬編碼的。是的,我認爲你是對的,謝謝 – quelquecosa

回答