【问题标题】:SQL · Dynamic pivot: replace NULL to zeros (0)SQL·动态pivot:将NULL替换为零(0)
【发布时间】:2019-09-27 08:46:03
【问题描述】:

我需要透视数据,变量:年(动态)。但是几年来我没有数据,我得到空值。我需要将那个空值替换为 0。

我已经尝试了一些示例,但我无法得到想要的结果。

谢谢

数据:

DECLARE @query  AS NVARCHAR(MAX),
    @cols AS NVARCHAR(MAX),   
    @anyoUltPax AS NVARCHAR(MAX),
    @anyoAntPax AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME([Año]) FROM paxESTOP WHERE ([Año] >= YEAR(GETDATE())-7) AND ([Año] <= YEAR(GETDATE())-1)
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');

SET @anyoUltPax =  CONVERT(INT,
                    CASE 
                    WHEN IsNumeric(CONVERT(VARCHAR(4),YEAR(GETDATE())-1)) = 1 THEN CONVERT(VARCHAR(4),YEAR(GETDATE())-1)
                    ELSE 0 END)

SET @anyoAntPax =  CONVERT(INT,
                    CASE 
                    WHEN IsNumeric(CONVERT(VARCHAR(4),YEAR(GETDATE())-2)) = 1 THEN CONVERT(VARCHAR(4),YEAR(GETDATE())-2)
                    ELSE 0 END)


set @query = 'SELECT *, [' + @anyoUltPax + ']-[' + @anyoAntPax+ '] as [Diferencia anual] FROM
        (

        SELECT [apto_base] as Origen,
               [apto_dest] as Destino,
               [cia_id] as [Compañía],
               [dim_Paises].pais AS País,
               [dim_Zonas].zona AS Zona,
               [CCAA_org].CCAA AS [CCAA base],
               [CCAA_dest].CCAA AS [CCAA dest],
               [ciudad] AS [Ciudad Destino],
               Distancia,
               Año,
               Pax     
        FROM 
        (SELECT [apto_base]
               ,[apto_dest]
               ,[cia_id]
               ,[pais_id]
               ,[zona_id]
               ,[CCAA_id_org]
               ,[CCAA_id_dest]
               ,[distancia]
               ,[año] as [Año]      
               ,SUM([pax_tot]) as Pax
        FROM [MKTPBI].[dbo].[paxESTOP]
        WHERE ([Año] >= YEAR(GETDATE())-7) AND ([Año] <= YEAR(GETDATE())-1) 
        GROUP BY [apto_base],[apto_dest],[cia_id],[pais_id],[zona_id],[CCAA_id_org],[CCAA_id_dest],[distancia],[Año]            
        ) pax           

    LEFT JOIN dim_Paises ON pax.pais_id = dim_Paises.pais_id
    LEFT JOIN dim_Zonas ON pax.zona_id = dim_Zonas.zona_id
    LEFT JOIN dim_CCAA as CCAA_org ON pax.CCAA_id_org = CCAA_org.CCAA_id
    LEFT JOIN dim_CCAA as CCAA_dest ON pax.CCAA_id_dest = CCAA_dest.CCAA_id
    LEFT JOIN dim_Aeropuertos ON pax.apto_dest = dim_Aeropuertos.apto_id 

       )  x

        pivot 
        (
            sum(x.Pax)
            for [Año] in (' + @cols + ')
        ) p order by ['+@anyoUltPax+'] desc '

execute(@query)

【问题讨论】:

  • 查看 SQL 方言代码,这看起来是 SQL Server 有效的 SQL 代码
  • 我尝试在 "sum" 之前添加 IFNULL 函数,但它不起作用 -> pivot(sum(x.Pax) for [Año] in (' + @cols + '))

标签: sql-server tsql null pivot


【解决方案1】:

要在 SQL Server 中将 null 更改为零,请使用:

ISNULL( mycol, 0 )

在甲骨文中:

NVL( mycol, 0 )

【讨论】:

  • 但这是动态支点,我认为它行不通。无论如何,谢谢。
  • 为什么你认为它不起作用?在您的动态 sql 中,您是否尝试使用 ISNULL 包装 sum(x.Pax)?失败了吗?
  • 我试过这个:pivot(isnull(sum(x.Pax),0) for [Año] in (' +@cols + ')) 我得到一个错误:'isnull' 是不是按公认功能分组的。
  • 而不是 ISNULL 在枢轴子句中,尝试将其放在 SELECT 子句中,例如在SUM([pax_tot]) as Pax 行 - SUM(ISNULL([pax_tot], 0)) as Pax
猜你喜欢
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多