Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/12/2011, 17h41   #1
Nouveau Membre du Club
 
Inscription : avril 2003
Messages : 167
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 167
Points : 37
Points : 37
Par défaut Problème sur un count avec group by sur plusieurs colonnes

Bonjour,

J'ai un problème sur un select comportant un count(*).

Voici ma table (elle permet de stocker plusieurs ligne de texte pour un élément identifié par n°1, n°2, n°3)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
----------------------------------------------------------------------------------
|1  |2 |3  |  numéro séq. | catégorie | texte                   |
--------|---------|---------|--------------|--------------------------------------
| 10    |    0    |   0     |  1           | A         | ligne 1 de ni1-A        |
| 10    |    0    |   0     |  2           | A         | ligne 2 de ni1-A        |
| 10    |    0    |   0     |  3           | A         | ligne 3 de ni1-A        |
| 10    |    0    |   0     |  1           | B         | ligne 1 de ni1-B        |
| 10    |    0    |   0     |  2           | B         | ligne 2 de ni1-B        |
| 10    |    0    |   0     |  3           |           | ligne 3 de ni1-A        |
| 10    |    25   |   0     |  1           | A         | ligne 1 de ni1, ni2 -A  |
| 10    |    25   |   0     |  2           | A         | ligne 2 de ni1, ni2 -A  |
| 10    |    25   |   0     |  1           | B         | ligne 1 de ni1, ni2 -B  |
| 10    |    25   |   0     |  2           | B         | ligne 2 de ni1, ni2 -B  |
----------------------------------------------------------------------------------
Pour n°1=10, n°2=0, n°3=0, je voudrais que le count me ramène 3 pour me dire que j'ai des enregistrements pour 3 catégories.
Je n'ai pas besoin de l'information m'indiquant que j'ai 3 lignes pour A et 2 lignes pour B et 1 sans catégorie.

Idem pour n°1=10, n°2=25, n°3=0, le count devrait me ramener 2 puisque j'ai des enregistrements pour A et pour B.

Seulement comment faire ce count?

Je pensais faire un group by sur n°1, n°2, n°3 mais ça me ramène le nombre total de lignes pour chaque n1, n2, n3.
en rajoutant la catégorie dans le group by, j'ai le nombre d'enregistrements pour chaque catégorie...

Bref, je ne m'en sors pas... Si quelqu'un voit comment faire, j'attends vos conseils!

Merci
linou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 18h50   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
La syntaxe de COUNT
Code :
1
2
3
SELECT num1, num2, num3, count(DISTINCT categorie)
  FROM la_table
 GROUP BY num1, num2, num3
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 30/12/2011, 09h10   #3
Nouveau Membre du Club
 
Inscription : avril 2003
Messages : 167
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 167
Points : 37
Points : 37
Merci!

Par contre, le distinct est de trop, non?
Lorsque je fais un count(distinct categorie) pour num1=10, num2=0, num3=0, j'obtiens 2, alors que count(categorie) = 3.
Et j'ai bien des enregistrements pour categ=A, categ = B et categ = null, donc le count(categorie) me parait plus adapté.

Faut que je revois toutes ces histoires de groupement, à force de faire des requêtes plutot simples, j'ai perdu la main...
linou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 09h31   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
C'est à cause de la valeur NULL, le count(colonne) ne compte pas les NULLs (tiré de la doc proposé ci dessus) :
Citation:
If you specify expr, then COUNT returns the number of rows where expr is not null. You can count either all rows, or only distinct values of expr.
Tu peux faire :
Code :
count(DISTINCT coalesce(colonne,'XXX'))
Où XXX est une valeur improbable pour une catégorie.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 10h15   #5
Nouveau Membre du Club
 
Inscription : avril 2003
Messages : 167
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 167
Points : 37
Points : 37
Citation:
Envoyé par skuatamad Voir le message
C'est à cause de la valeur NULL, le count(colonne) ne compte pas les NULLs (tiré de la doc proposé ci dessus) :
J'ai bien compris mais à quoi sert le distinct finalement?...
linou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 11h00   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
Ben DISTINCT permet de compter 1 seule fois A, 1 seule fois B et, avec le COALESCE, 1 seule fois la valeur NULL, donc le résultat sera 3 pour 10,0,0.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 11h19   #7
Nouveau Membre du Club
 
Inscription : avril 2003
Messages : 167
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 167
Points : 37
Points : 37
Citation:
Envoyé par skuatamad Voir le message
Ben DISTINCT permet de compter 1 seule fois A, 1 seule fois B et, avec le COALESCE, 1 seule fois la valeur NULL, donc le résultat sera 3 pour 10,0,0.
Oui mais sans le distinct, j'ai déjà 3 donc quelle est la différence au niveau base?
linou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 11h29   #8
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
Je ne vois pas bien où tu as 3 sans DISTINCT + COALESCE (avec l'exemple fourni) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SQL> WITH t (n1,n2,n3,numseq,categorie) AS (
  2  SELECT 10,0,0,1,'A' FROM dual union ALL
  3  SELECT 10,0,0,2,'A' FROM dual union ALL
  4  SELECT 10,0,0,3,'A' FROM dual union ALL
  5  SELECT 10,0,0,1,'B' FROM dual union ALL
  6  SELECT 10,0,0,2,'B' FROM dual union ALL
  7  SELECT 10,0,0,3,''  FROM dual union ALL
  8  SELECT 10,25,0,1,'A' FROM dual union ALL
  9  SELECT 10,25,0,2,'A' FROM dual union ALL
 10  SELECT 10,25,0,1,'B' FROM dual union ALL
 11  SELECT 10,25,0,2,'B' FROM dual
 12  )
 13  SELECT n1,n2,n3,
 14         count(*), count(categorie), count(DISTINCT categorie), count(DISTINCT coalesce(categorie,'XXX'))
 15    FROM t
 16   GROUP BY n1,n2,n3
 17  /
 
        N1         N2         N3   COUNT(*) COUNT(CATEGORIE) COUNT(DISTINCTCATEGORIE) COUNT(DISTINCTCOALESCE(CATEGORIE,'XXX'))
---------- ---------- ---------- ---------- ---------------- ------------------------ ----------------------------------------
        10          0          0          6                5                        2                                3
        10         25          0          4                4                        2                                2
 
SQL>
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 09/01/2012, 09h45   #9
Nouveau Membre du Club
 
Inscription : avril 2003
Messages : 167
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 167
Points : 37
Points : 37
Citation:
Envoyé par skuatamad Voir le message
Je ne vois pas bien où tu as 3 sans DISTINCT + COALESCE (avec l'exemple fourni) :
Je parlais pas avec le coalesce, mais seulement avec le count(distinct categorie).
linou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h18.


 
 
 
 
Partenaires

Hébergement Web