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 18/01/2012, 16h15   #1
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Par défaut Count multiple : quelle méthode ?

Bonjour,

je cherche à connaitre le nombre d'enregistrements d'une table à partir de sa clé primaire.
Donc en théorie ça revient à faire
sauf que dans mon cas, la clé primaire est constituée de 4 colonnes (deux colonnes varchar2 et 2 colonnes number). Et je ne trouve pas d'exemple sur Google pour ce cas de figure.
J'ai déjà essayé
Code :
1
2
 
count (champ1, champ2, ...)
me renvoie une erreur
Citation:
ORA-00909: nombre d'arguments non valide
Code :
1
2
 
count (champ1 + champ2 + ....)
me renvoie une erreur.
Citation:
ORA-01722: Nombre non valide
Pour le moment je fais ça :
Code :
1
2
 
count(champ1) + count(champ2) + ...
mais j'ai un doute.

Merci à ceux qui sauront m'expliquer laquelle est bonne et pourquoi.
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 16h20   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Pourquoi pas count(*) ???
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2012, 16h28   #3
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Le résultat est complètement différent entre
Code :
1
2
 
count (champ1) + count (champ2) + ...
et
donc j'avoue ne pas savoir
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 16h35   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Dans quel cas faites vous le count ?

Est-ce sur une table issue d'une jointure externe ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 16h38   #5
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
--> va compter (sans distinction de colonnes) le nombre d'enregistrements dans ta table.

Tandis que :

Code :
count (champ1) + count (champ2) + ...
--> va faire la somme du nombre d'enregistrement du champ 1 et du nombre d'enregistrement du champ 2.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 16h40   #6
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Euh non, simplement à des fins de test pour le moment.
On m'a conseillé (vu que ce que je faisais était complètement faux) de récupérer les 4 champs et avec une requête imbriquée de calculer le résultat.

comment on fait ça ?
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 16h44   #7
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Tu n'as pas besoin de t'embêter à récupérer les 4 champs, en effet puisqu'il s'agit de la clé primaire alors pour chaque enregistrement de la table une valeur existe pour tes 4 champs.

Le count(*) suffit largement pour ça.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 20h24   #8
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Est-ce qu'il y a moyen d'en savoir un peu plus sur la façon dont est géré count(*) par Oracle ? Il doit bien concaténer les champs pour pouvoir compter non ?
Comment est-ce qu'il les concatène ?
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 20h50   #9
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Citation:
Envoyé par feldi Voir le message
Est-ce qu'il y a moyen d'en savoir un peu plus sur la façon dont est géré count(*) par Oracle ? Il doit bien concaténer les champs pour pouvoir compter non ?
Comment est-ce qu'il les concatène ?
Qu'est ce que tu cherches à inventer là ?
un count(*) va compter le nombre d’occurrences que ramène ta requête, indépendamment de la clef primaire ou du nombre de colonnes.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 21h07   #10
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
mais mais mais
Donc finalement un count(*) simplement me ramènera le nombre de lignes qui ont cette clé primaire ?
Et en plus ça règle le problème des doublons étant donné qu'une clé primaire est unique.

Et pour une table qui n'a pas de clé primaire ? Comment on peut faire alors pour un count de plusieurs champs pour éviter les doublons ?
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 21h42   #11
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Citation:
Envoyé par feldi Voir le message
Donc finalement un count(*) simplement me ramènera le nombre de lignes qui ont cette clé primaire ?
Il faudrait voir ta requête et les jointures qui sont dessus...

Pourrais-tu nous fournir un exemple précis de ce que tu veux avec des tables de testes ou au moins avoir ta requête en entier avec la description des tables, parce que ton besoin initial reste encore assez vague.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 22h01   #12
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Erf, je ne suis plus en entreprise la.
Mais de tête :
En gros, on a une table de devis (table A) et une table de devis détaillé (table B).
Normalement, pour une ligne de la table A, on doit avoir une et une seule ligne dans la table B. Or après test, il se trouve qu'il y a plus de lignes dans la table B que dans la table A.

Donc il faut retrouver dans la table A le nombre de lignes pour une période donnée sans doublons (table avec la clé primaire).
Et ensuite même chose pour l'autre table qui n'a pas de clé primaire celle la.

En fait, je dois faire ça pour retrouver des lignes "en trop" dans la table B qui ne devraient pas y être.

Je sais que c'est vague, moi même j'ai un peu de mal à cerner tout le problème. Surtout que ça ne représente qu'une petite partie du projet.
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 22h08   #13
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Si c'est un problème de doublon, as-tu lu la note suivante de la FAQ ?
http://oracle.developpez.com/faq/?page=3-1#doublons
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 07h32   #14
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Et n'y aurai-t-il pas un problème de modélisation par la même occasion ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 11h52   #15
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut,

Code :
1
2
3
4
5
6
 
SELECT a.pk, count(*)
FROM a
  JOIN b ON a.pk = b.pk
GROUP BY a.pk
HAVING count(*) > 1
Ca te donne les PK de A qui dans B ont plusieurs lignes... mais on en saura bien plus quand tu seras à nouveau en entreprise pour donner un exemple concret et précis.

Pour le count :
count(*), c'est le nombre de ligne de :
- ton groupe s'il y a un group by
- ta requête entière sinon

count(expr), c'est le nombre de lignes tout pareil qu'au dessus sauf qu'on ne compte pas les expr NULL ! "Expr" peut être une colonne, ou une expression plus complexe mixant colonnes, d'opérateurs, fonctions, constantes, ...

count(DISTINCT expr), c'est le nombre d'occurrences distinctes de ton expr.
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/01/2012, 09h04   #16
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Alors, mes requêtes :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT DISTINCT id_Domain, id_Cart, num_version, num_line, count(*)
FROM cla, dcf
WHERE date1 BETWEEN '20110101' AND '20111231'
    AND flag2 = 1 
    AND id_item <> 'multi-produits'
    AND id_item <> 'price List'
    AND id_item <> 'simu'
    AND dcf.idcart = cla.z_id_cart
    AND dcf.linequote = cla.num_line
GROUP BY id_domain, id_cart, num_version, num_line;
pour la table A (cla)

et
Code :
1
2
3
4
5
6
7
 
SELECT DISTINCT idcart, linequote, numberofevo, count(*)
FROM cla, dcf
WHERE dateoffer BETWEEN '2011/01/01' AND '2011/12/31'
    AND dcf.idcart = cla.z_id_cart
    AND dcf.linequote = cla.num_line
GROUP BY idcart, linequote, numberofevo;
pour la table B (dcf).

La première requête me renvoie 36592 lignes et la deuxième 40645.
Donc il y a plus de lignes dans dcf que dans cla.

J'ai donc essayé la requête de pacman :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT id_Domain, id_Cart, num_version, num_line, count(*)
FROM cla
  JOIN dcf ON dcf.idcart = cla.z_id_cart
                   AND dcf.linequote = cla.num_line
                   AND date1 BETWEEN '20110101' AND '20111231'
                   AND flag2 = 1 
                   AND id_item <> 'multi-produits'
                   AND id_item <> 'price List'
                   AND id_item <> 'simu'
GROUP BY id_Domain, id_Cart, num_version, num_line
HAVING count(*) > 1 ;
qui me renvoie 0 lignes et en changeant les tables :

Code :
1
2
3
4
5
6
7
8
 
SELECT idcart, linequote, numberofevo, count(*)
FROM dcf
  JOIN cla ON dcf.idcart = cla.z_id_cart
                                            AND dcf.linequote = cla.num_line
                                            AND dateoffer BETWEEN '2011/01/01' AND '2011/12/31'
GROUP BY idcart, linequote, numberofevo
HAVING count(*) > 1 ;
qui me renvoie également 0 lignes.
Y a un truc qui a du m'échapper la, étant donné qu'il y a 4050 lignes de plus dans la deuxième table.
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 10h09   #17
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Bonjour,

Tu n'as peut-être pas bien compris le fonctionnement du having count(*) >1.

Il te permet de retourner les lignes telles que leur count est supérieur à 1.

Un exemple pour illustrer ça :

Code :
1
2
SELECT id, count(*) Cnt
FROM MaTable
Citation:
id | Cnt
1 | 1
2 | 1
3 | 2

Citation:
SELECT id, count(*) Cnt
FROM MaTable
HAVING count(*) > 1
Est-ce que ce que tu voudrais faire c'est pas plutôt une différence entre les deux tables ? Dans ce cas ce tuto pourrait bien t'aider.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 10h21   #18
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
OK, je vais m'orienter la dessus.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
SELECT dcf.idcart, dcf.linequote
FROM dcf, cla
WHERE dcf.dateoffer BETWEEN '2011/03/01' AND '2011/03/31' 
    AND  dcf.idcart = cla.z_id_cart
    AND dcf.linequote = cla.num_line
EXCEPT 
SELECT cla.id_Cart, cla.num_line
FROM cla, dcf
WHERE dcf.idcart = cla.z_id_cart
    AND dcf.linequote = cla.num_line
    AND cla.date1 BETWEEN '20110301' AND '20110331'
    AND cla.flag2 = 1 
    AND cla.id_item <> 'multi-produits'
    AND cla.id_item <> 'price List'
    AND cla.id_item <> 'simu';
Si j'ai bien compris l'exemple : on prend les lignes de dcf - les lignes de cla ?

Par contre j'ai un message d'erreur :
Citation:
Error at line 3
ORA-00933: la commande SQL ne se termine pas correctement
On ne peut pas mettre de conditions avec cette structure ? ça me parait bizarre.
feldi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 10h33   #19
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Il me semble que dans oracle (d'après le tuto) il faille utiliser MINUS à la place d'EXCEPT.

P.S : Par contre ici tu ne fais pas juste la différence entre dcf et cla car tes deux tables sont présentes dans tes deux requêtes.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/01/2012, 11h06   #20
Membre régulier
 
Homme Nicolas
Étudiant
Inscription : mai 2010
Messages : 309
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2010
Messages : 309
Points : 74
Points : 74
Effectivement, avec MINUS, la requête me donne un résultat.
Par contre, la requête me renvoie le nombre de lignes de dcf, non la différence.
J'ai testé en enlevant les jointures des select mais j'obtiens un résultat supérieur au nombre de lignes initial de dcf.

Lola06, j'ai bien lu ton PS mais il faut bien que je garde les jointures pour être sur de tester les bonnes lignes non ? Comment faire ça alors ?

J'affine pour le moment sur le mois de mars et je devrais trouver une différence de 307 lignes normalement.
feldi 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 06h45.


 
 
 
 
Partenaires

Hébergement Web