Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 15/02/2007, 14h21   #1
Candidat au titre de Membre du Club
 
Homme
Administrateur de base de données
Inscription : juillet 2006
Messages : 109
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Transports

Informations forums :
Inscription : juillet 2006
Messages : 109
Points : 12
Points : 12
Par défaut 1 seul select comprenant plusieurs count avec critères différent

bonjour

je voudrais pouvoir faire un seul select sur T1
et obtenir les 3 count suivants:
Code :
1
2
3
4
5
 
SELECT count(F1)
FROM t1
WHERE C1
GROUP BY F2
Code :
1
2
3
4
SELECT count(F1)
FROM t1
WHERE C2
GROUP BY F2
Code :
1
2
3
4
SELECT count(F1)
FROM t1
WHERE C3
GROUP BY F2
avec des jointures et en clonant 3 fois T1 les count sont faux.

avec sous requetes je ne vois pas bien!
gg2vig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 14h50   #2
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT
        A.Tot
        , B.Tot
        , C.Tot
FROM    
          (
            SELECT count(F1) Tot
            FROM t1
            WHERE C1
            GROUP BY F2
          )     A
        , (
            SELECT count(F1) Tot
            FROM t1
            WHERE C2
            GROUP BY F2
          )     B
        , (
            SELECT count(F1) Tot
            FROM t1
            WHERE C3
            GROUP BY F2
          ) C
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 14h55   #3
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
avec des fonctions analytiques ça doit se faire très facilement...

Eventuellement :
Code :
1
2
3
4
            SELECT SUM(DECODE(col,C1,1,0)), SUM(DECODE(col,C2,1,0)), SUM(DECODE(col,C2,1,0))
            FROM t1
            WHERE C1 OR C2 OR C3
            GROUP BY F2
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 16h10   #4
Candidat au titre de Membre du Club
 
Homme
Administrateur de base de données
Inscription : juillet 2006
Messages : 109
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Transports

Informations forums :
Inscription : juillet 2006
Messages : 109
Points : 12
Points : 12
Par défaut suite

ok

mais comment synchroniser les 3 counts pour chaque occurence de F2 ?

pour obtenir un tableau du type

F2,A.tot,B.tot,C.tot
gg2vig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 16h37   #5
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Comme l'a suggéré Fred, regarde du côté des fonctions analytiques...

sinon, tu aurais un petit Testcase à nous proposer ? on irais plus vite pour essayer de te dégager une solution...
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 18h35   #6
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Citation:
Envoyé par gg2vig
ok

mais comment synchroniser les 3 counts pour chaque occurence de F2 ?

pour obtenir un tableau du type

F2,A.tot,B.tot,C.tot
Rajoute F2 dans le select de la requête de Fred tout simplement...
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 10h51   #7
Candidat au titre de Membre du Club
 
Homme
Administrateur de base de données
Inscription : juillet 2006
Messages : 109
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Transports

Informations forums :
Inscription : juillet 2006
Messages : 109
Points : 12
Points : 12
Par défaut exemple simplifié du besoin

table plan :champs plan_code,plan_libellé

table activité:champs act_code,act_plan,act_dateprev,act_datereal

je veux lister tous les plan_code,plan_libellé de la table plan (group by plan_code,plan_libellé)

et avec jointure act_plan = plan_code compter :
1)le nombre d'act_code dont dateprev between :date_debut and :date_fin

2) compter également dans le meme select le nombre 'act_code dont datereal between :date_debut and :date_fin
gg2vig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 12h40   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Code :
1
2
3
4
5
6
7
8
SELECT plan_code, plan_libelle,
		SUM(DECODE(		SIGN(dateprev - :date_deb), -1, 0,
					DECODE(SIGN(dateprev - :date_fin), 1, 0, NULL, 0, 1)))  AS nb_dateprev,
		SUM(DECODE(		SIGN(datereal - :date_deb), -1, 0,
					DECODE(SIGN(datereal - :date_fin), 1, 0, NULL, 0, 1)))  AS nb_dateprev
FROM TPLAN p, ACTIVITE a
WHERE a.act_plan = p.plan_code
GROUP BY p.plan_code, p.plan_libelle
EDIT : Rajout du NVL dans le cas de dates non renseignées.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 12h53   #9
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
En fait y'a plus simple avec le CASE.
Code :
1
2
3
4
5
6
SELECT plan_code, plan_libelle,
		SUM(CASE WHEN dateprev BETWEEN :date_deb AND :date_fin THEN 1 ELSE 0 END)  AS nb_dateprev,
		SUM(CASE WHEN datereal BETWEEN :date_deb AND :date_fin THEN 1 ELSE 0 END)  AS nb_datereal
FROM TPLAN p, ACTIVITE a
WHERE a.act_plan = p.plan_code
GROUP BY p.plan_code, p.plan_libelle
__________________
More Code : More Bugs. Less Code : Less Bugs
McM 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 04h03.


 
 
 
 
Partenaires

Hébergement Web