2016-07-28 85 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

回答