web-dev-qa-db-fra.com

Comment remplacer des valeurs (nulles) par une sortie dans PIVOT

J'ai essayé de convertir les valeurs (nulles) avec 0 (zéros) en sortie dans la fonction PIVOT, mais sans succès.

Ci-dessous le tableau et la syntaxe que j'ai essayée "

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

J'ai essayé d'utiliser le ISNULL mais je n'ai pas fonctionné.

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

Quelqu'un pourrait-il s'il vous plaît examiner son erreur de syntaxe? Merci beaucoup!

33
joe
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
33
Sankara

Si vous utilisez des colonnes dynamiques dans votre instruction pivot, vous pouvez utiliser les éléments suivants:

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

Vous ne pouvez pas placer la IsNull() tant que les données ne sont pas sélectionnées. Vous allez donc placer la IsNull() autour de la valeur finale dans la 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
11
Taryn

Parfois, il est préférable de penser comme un analyseur, comme l’analyseur T-SQL. Lors de l'exécution de l'instruction, l'analyseur n'a aucune valeur dans la section de pivot et vous ne pouvez avoir aucune expression de contrôle dans cette section. En passant, vous pouvez simplement utiliser ceci:

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
2
Rikki

Vous devez prendre en compte toutes les valeurs du jeu de pivot. vous pouvez accomplir cela en utilisant un produit cartésien.

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
1
maero

Pour modifier les résultats sous pivot, vous pouvez placer les colonnes dans les champs sélectionnés, puis les modifier en conséquence. Peut-être que vous pouvez utiliser DECODE pour les colonnes que vous avez construites en utilisant la fonction pivot. 

  • Kranti A
0
Kranti Kumar