IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

PIVOT INCLUDE NULLS


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut PIVOT INCLUDE NULLS
    Bonjour,
    la requête suivante ne recense pas les valeurs nulles (voir colonne COMPTE_NULL correspondant aux valeurs NULL de COL03)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    WITH TABLE_1 AS (
              SELECT '01' AS COL01 ,'11' AS COL02,'8011551' AS COL03,'002' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'11' AS COL02,'8011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'11' AS COL02,'8011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'11' AS COL02,'8011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'11' AS COL02,'8011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'13' AS COL02,'8011553' AS COL03,'103' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'13' AS COL02,'8011553' AS COL03,'104' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,NULL AS COL03,'002' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,NULL AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,'7011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,'7011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,'7011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'13' AS COL02,'7011553' AS COL03,'103' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'13' AS COL02,'7011553' AS COL03,'104' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'11' AS COL02,'9011551' AS COL03,'002' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'11' AS COL02,'9011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'12' AS COL02,'9011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'12' AS COL02,'9011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'11' AS COL02,'9011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'15' AS COL02,'9011553' AS COL03,'103' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'15' AS COL02,'9011553' AS COL03,'104' AS COL04 FROM DUAL
     
    )
    SELECT 
    *
    FROM TABLE_1
    PIVOT (
      COUNT(COL04) FOR COL03  IN ('8011551' AS COMPTE_8011551,'7011551' AS COMPTE_7011551,'9011551' AS COMPE_9011551,NULL AS COMPTE_NULL) 
    )
     
    COL01 COL02 COMPTE_8011551 COMPTE_7011551 COMPE_9011551 COMPTE_NULL
    ----- ----- -------------- -------------- ------------- -----------
    02    11                 0              1             0           0 
    03    12                 0              0             1           0 
    01    13                 0              0             0           0 
    01    11                 3              0             0           0 
    02    13                 0              0             0           0 
    03    11                 0              0             2           0 
    03    15                 0              0             0           0 
     
     7 lignes sélectionnées
    Afin de résoudre ce problème ,j'ai converti les valeurs nulles de COL03,de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    WITH TABLE_1 AS (
              SELECT '01' AS COL01 ,'11' AS COL02,'8011551' AS COL03,'002' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'11' AS COL02,'8011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'11' AS COL02,'8011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'11' AS COL02,'8011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'11' AS COL02,'8011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'13' AS COL02,'8011553' AS COL03,'103' AS COL04 FROM DUAL
    UNION ALL SELECT '01' AS COL01 ,'13' AS COL02,'8011553' AS COL03,'104' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,NULL AS COL03,'002' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,NULL AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,'7011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,'7011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'11' AS COL02,'7011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'13' AS COL02,'7011553' AS COL03,'103' AS COL04 FROM DUAL
    UNION ALL SELECT '02' AS COL01 ,'13' AS COL02,'7011553' AS COL03,'104' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'11' AS COL02,'9011551' AS COL03,'002' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'11' AS COL02,'9011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'12' AS COL02,'9011551' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'12' AS COL02,'9011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'11' AS COL02,'9011552' AS COL03,'100' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'15' AS COL02,'9011553' AS COL03,'103' AS COL04 FROM DUAL
    UNION ALL SELECT '03' AS COL01 ,'15' AS COL02,'9011553' AS COL03,'104' AS COL04 FROM DUAL
    )
    ,TABLE_2 AS (
    SELECT 
    COL01,COL02,NVL(COL03,'NULL') AS COL03,COL04
    FROM TABLE_1
    )
    SELECT * FROM TABLE_2
    PIVOT (
      COUNT(COL04) FOR COL03  IN ('8011551' AS COMPTE_8011551,'7011551' AS COMPTE_7011551,'9011551' AS COMPE_9011551,'NULL' AS COMPTE_NULL) 
    )
     
    COL01 COL02 COMPTE_8011551 COMPTE_7011551 COMPE_9011551 COMPTE_NULL
    ----- ----- -------------- -------------- ------------- -----------
    02    11                 0              1             0           2 
    03    12                 0              0             1           0 
    01    13                 0              0             0           0 
    01    11                 3              0             0           0 
    02    13                 0              0             0           0 
    03    11                 0              0             2           0 
    03    15                 0              0             0           0 
     
     7 lignes sélectionnées

    N'y avait-il pas une meilleure méthode?

  2. #2
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    avec la fonction DECODE ?

    DECODE(monchamp,null,'la valeur que tu veux signifier pour le null',monchamp)

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Normal, le NULL sont éliminés par des opérations d'agrégat.

    Vous pouvez faire votre PIVOT "à l'ancienne" pour gérer vos NULL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
    		COL01,
    		COL02,
    		SUM(CASE WHEN COL03 = '8011551' THEN 1 ELSE 0 END) AS COMPTE_8011551,
    		SUM(CASE WHEN COL03 = '7011551' THEN 1 ELSE 0 END) AS COMPTE_7011551,
    		SUM(CASE WHEN COL03 = '9011551' THEN 1 ELSE 0 END) AS COMPTE_9011551,
    		SUM(CASE WHEN COL03 IS NULL THEN 1 ELSE 0 END) AS COMPTE_NULL
    FROM TABLE_1
    GROUP BY 
    		COL01,
    		COL02

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Table pivoté - enlever les NULL
    Par markham dans le forum MySQL
    Réponses: 1
    Dernier message: 22/02/2015, 10h17
  2. @FXML + include = null
    Par le y@m's dans le forum JavaFX
    Réponses: 12
    Dernier message: 06/07/2012, 09h05
  3. Problème de NULL sur un Pivot basé sur une Table Dynamique
    Par guilld dans le forum Développement
    Réponses: 3
    Dernier message: 01/08/2011, 16h05
  4. [VB6] [BDD] Recordset et champ égal à Null
    Par Gr|ppen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2003, 11h00
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 01h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo