2012-09-07 13 views
22

Próbowałem przekonwertować wartości (zerowe) na 0 (zera) w funkcji PIVOT, ale nie udało się.Jak zamienić wartości (zerowe) na 0 w PIVOT

Poniżej znajduje się tabela i składnia próbowałem”

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 

Próbowałem użyć ISNULL ale nie działa.

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

Może ktoś proszę spojrzeć na jego błąd składni? Wielkie dzięki!

Odpowiedz

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

To nie zawsze działa . Gdy występują różnice w liczbie rekordów, pivot tworzy nowe "komórki", które mogą mieć wartość NULL. Rozwiązanie powinno uwzględniać ten scenariusz. – greenafrican

+0

Czy możesz dodać jakieś wyjaśnienie do tej odpowiedzi? –

11

Nie można umieścić urządzenia IsNull(), dopóki dane nie zostaną wybrane, więc umieszcza się IsNull() wokół ostatecznej wartości e w 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

Czasami lepiej myśleć jak parser, jak T-SQL parsera. Podczas wykonywania instrukcji parser nie ma żadnej wartości w sekcji przestawnej i nie może mieć żadnego wyrażenia kontrolnego w tej sekcji. Nawiasem mówiąc, można po prostu użyć tego:

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

Jeśli masz sytuację, w której używasz dynamicznych kolumn w zestawieniu obrotu można użyć następujących:

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

Nie ładne, ale działa, musiałem również dodać alias kolumny! * drży * – Shaun