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
下面是我得到的結果:
編輯:我一直工作在動態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;
這是實際的代碼嗎?如果是這樣,你如何確定你的樞軸聲明中的IN子句?該過程顯示'@ from' AND'@ until'作爲參數傳入,但IN子句硬編碼。它看起來像你需要構建動態sql來生成IN子句。在這種情況下,您可以在構建sql時選擇唯一的LAPSO_DOC值。喬的回答下面有一個關於構建動態數據透視的更多細節的鏈接。 –
是的,它們目前是硬編碼的。是的,我認爲你是對的,謝謝 – quelquecosa