Come sostituire (null) i valori con 0 output in PIVOT

Ho provato a convertire i valori (null) con l’output 0 (zeri) nella funzione PIVOT ma non ho successo.

Di seguito è la tabella e la syntax che ho provato ”

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 

Ho provato a usare ISNULL ma non ha funzionato.

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

Qualcuno potrebbe per favore guardare nel suo errore di syntax? Molte grazie!

 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 

Se hai una situazione in cui stai usando le colonne dinamiche nella tua dichiarazione pivot puoi usare quanto segue:

 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 ') 

Non è ansible posizionare IsNull() fino a dopo la selezione dei dati, pertanto verrà posizionato IsNull() attorno al valore finale in 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 

A volte è meglio pensare come un parser, come il parser T-SQL. Durante l’esecuzione dell’istruzione, il parser non ha alcun valore nella sezione Pivot e non è ansible avere alcuna espressione di controllo in quella sezione. A proposito, puoi semplicemente usare questo:

 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 

Devi tenere conto di tutti i valori nel set pivot. puoi farlo usando un prodotto cartesiano.

 select pivoted.* from ( select cartesian.key1, cartesian.key2, isnull(relationship.[value],'nullvalue') as [value] from ( select k1.key1, k2.key2 from ( select distinct key1 from relationship) k1 ,( select distinct key2 from relationship) k2 ) cartesian left outer join relationship on relationship.key1 = cartesian.key1 and relationship.key2 = carterisan.key2 ) data pivot ( max(data.value) for ([key2_v1], [key2_v2], [key2_v3], ...) ) pivoted 

Per modificare i risultati in pivot, puoi inserire le colonne nei campi selezionati e quindi modificarli di conseguenza. Può essere che tu possa usare DECODE per le colonne che hai creato usando la funzione pivot.

  • Kranti A