2012-09-07 13 views
22

Intenté convertir los valores (nulos) con 0 (ceros) de salida en la función PIVOT pero no tuve éxito.Cómo reemplazar valores (nulos) con salida 0 en PIVOT

A continuación se muestra la tabla y la sintaxis He tratado"

SELECT 
CLASS, 
[AZ], 
[CA], 
[TX] 
FROM #TEMP 
PIVOT (SUM(DATA) 
FOR STATE IN ([AZ], [CA], [TX])) AS PVT 
ORDER BY CLASS 

CLASS AZ CA  TX 
RICE 10 4  (null) 
COIN 30 3  2 
VEGIE (null) (null) 9 

He intentado utilizar el ISNULL pero no funcionó.

PIVOT SUM(ISNULL(DATA,0)) AS QTY 

Podría alguien por favor mirar en su error de sintaxis? ¡Muchas gracias!

Respuesta

30
SELECT CLASS, 
isnull([AZ],0), 
isnull([CA],0), 
isnull([TX],0) 
FROM #TEMP 
PIVOT (SUM(DATA) 
FOR STATE IN ([AZ], [CA], [TX])) AS PVT 
ORDER BY CLASS 
+6

Esto no siempre funciona . Cuando hay diferencias en el número de registros, el pivote crea nuevas 'celdas' que pueden ser NULL. Una solución debe atender ese escenario. – greenafrican

+0

¿Puedes agregar alguna explicación a esta respuesta? –

11

No puede colocar el IsNull() hasta después de seleccionar los datos, por lo que colocará el IsNull() en el valor final e en el SELECT:

SELECT CLASS, 
    IsNull([AZ], 0) as [AZ], 
    IsNull([CA], 0) as [CA], 
    IsNull([TX], 0) as [TX] 
FROM #TEMP 
PIVOT 
(
    SUM(DATA) 
    FOR STATE IN ([AZ], [CA], [TX]) 
) AS PVT 
ORDER BY CLASS 
3

a veces es mejor que pensar como un analizador, como analizador de T-SQL. Mientras se ejecuta la declaración, el analizador no tiene ningún valor en la sección Pivote y no se puede tener ninguna expresión de verificación en esa sección. Por cierto, puede simplemente usar esto:

SELECT CLASS 
, IsNull([AZ], 0) 
, IsNull([CA], 0) 
, IsNull([TX], 0) 
    FROM #TEMP 
    PIVOT (
     SUM(DATA) 
     FOR STATE IN (
      [AZ] 
     , [CA] 
     , [TX] 
     ) 
    ) AS PVT 
    ORDER BY CLASS 
11

Si usted tiene una situación en la que está utilizando columnas dinámicas en su declaración de pivote se puede utilizar el siguiente:

DECLARE @cols    NVARCHAR(MAX) 
DECLARE @colsWithNoNulls NVARCHAR(MAX) 
DECLARE @query    NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name) 
      FROM Hospital 
      WHERE Active = 1 AND StateId IS NOT NULL 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @colsWithNoNulls = STUFF(
      (
       SELECT distinct ',ISNULL(' + QUOTENAME(Name) + ', ''No'') ' + QUOTENAME(Name) 
       FROM Hospital 
       WHERE Active = 1 AND StateId IS NOT NULL 
       FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

EXEC (' 
     SELECT Clinician, ' + @colsWithNoNulls + ' 
     FROM 
     (
      SELECT DISTINCT p.FullName AS Clinician, h.Name, CASE WHEN phl.personhospitalloginid IS NOT NULL THEN ''Yes'' ELSE ''No'' END AS HasLogin 
      FROM Person p 
      INNER JOIN personlicense pl ON pl.personid = p.personid 
      INNER JOIN LicenseType lt on lt.licensetypeid = pl.licensetypeid 
      INNER JOIN licensetypegroup ltg ON ltg.licensetypegroupid = lt.licensetypegroupid 
      INNER JOIN Hospital h ON h.StateId = pl.StateId 
      LEFT JOIN PersonHospitalLogin phl ON phl.personid = p.personid AND phl.HospitalId = h.hospitalid 
      WHERE ltg.Name = ''RN'' AND 
       pl.licenseactivestatusid = 2 AND 
       h.Active = 1 AND 
       h.StateId IS NOT NULL 
     ) AS Results 
     PIVOT 
     (
      MAX(HasLogin) 
      FOR Name IN (' + @cols + ') 
     ) p 
') 
+0

No es bonito pero funciona, ¡también tuve que agregar un alias de columna! * estremecimientos * – Shaun

Cuestiones relacionadas