Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
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 19/08/2004, 15h53   #1
sm
Invité de passage
 
Inscription : août 2004
Messages : 2
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 2
Points : 0
Points : 0
Par défaut [DB2]Requête regroupement par intervals

Je suis novice dans l'art de poser des requêtes SQL (DB2)
J'ai le pb suivant:

Dans une table j'ai par un N° client et son niveau de risque (nombre de 0 à 499)

Exemple:
N° Niv Risq
112011 001
145011 250
154012 315

Je souhaite connaître le nombre de mes clients par classe de risque.
Classe 1 : 0<=Niv Risq<=99
Classe 2 : 100<=Niv Risq<=199
Classe 3 : 200<=Niv Risq<=399
Classe 4 : 400<=Niv Risq<=499

Quelle requête poser?
D'avance merci

SM
sm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2004, 16h49   #2
Membre régulier
 
Inscription : février 2003
Messages : 165
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 165
Points : 94
Points : 94
En définissant une colonne : Classe de risque.

Exemple:
Code :
1
2
3
4
N°      Niv Risq   Cls risq
112011  001        1
145011  250        3
154012  315        3
Pour l'exemple donné ci-dessus :
Classe 1 : 0<=Niv Risq<=99
Classe 2 : 100<=Niv Risq<=199
Classe 3 : 200<=Niv Risq<=399
Classe 4 : 400<=Niv Risq<=499

La requête sera alors :

Code :
1
2
3
4
SELECT SUM() AS NbClient, Classe
FROM MaTable
GROUP BY Classe
ORDER BY Classe
SebCBien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2004, 08h28   #3
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

Informations professionnelles :
Activité : SharePoint developpeur
Secteur : Service public

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
En Sql tu peux aussi utiliser des fonctions . Si j'en crois ton exemple, Risq est de type string. Alors tu peux faire:

Code :
1
2
3
4
5
 
SELECT count() AS NbClient, substr(risq,1,1) AS Classe 
FROM MaTable 
GROUP BY substr(risq,1,1)
ORDER BY classe
Et voila le travail.
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2004, 12h10   #4
Membre régulier
 
Inscription : février 2003
Messages : 165
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 165
Points : 94
Points : 94
Ca ne marchera pas avec la classe 3 car elle comprend les niveaux de risque de 200 à 399.

Il va devoir être obligé de créer une 5° classe s'il ne veut pas créer une 3 colonne (classe de risque), soit :

Classe 1 : 000<=Niv Risq<=099
Classe 2 : 100<=Niv Risq<=199
Classe 3 : 200<=Niv Risq<=299
Classe 4 : 300<=Niv Risq<=399
Classe 5 : 400<=Niv Risq<=499

Il faudra aussi mettre un 0 (zéro) devant la niveau de risque pour la classe 1.
SebCBien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2004, 14h15   #5
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

Informations professionnelles :
Activité : SharePoint developpeur
Secteur : Service public

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
Oui exacte je n'avais pas fait attention. Il peut créer sa propre fonction mais c'est une autre histoire
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2004, 14h57   #6
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

Informations professionnelles :
Activité : SharePoint developpeur
Secteur : Service public

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
Si le nombre de classe est réduit, il reste encore comme solution:
Code :
1
2
3
4
5
6
7
8
 
SELECT count() AS nbr,'1' AS classe FROM Client WHERE int(Risq)<=99
UNION
SELECT count() AS nbr,'1' AS classe FROM Client WHERE int(Risq)>=100 AND int(Risq)<=199
UNION
SELECT count() AS nbr,'1' AS classe FROM Client WHERE int(Risq)>=200 AND int(Risq)<=399
UNION
SELECT count() AS nbr,'1' AS classe FROM Client WHERE int(Risq)>=400 AND int(Risq)<=499
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2004, 16h23   #7
sm
Invité de passage
 
Inscription : août 2004
Messages : 2
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 2
Points : 0
Points : 0
Merci pour toutes ces idées. Je pense que l'on ne peut pas utiliser GROUP BY avec une opération sur une colonne. Qu'en pensez vous?
sm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2004, 21h27   #8
Membre régulier
 
Inscription : février 2003
Messages : 165
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 165
Points : 94
Points : 94
Je viens de tester.
Apparement, ce n'est pas possible.
SebCBien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2004, 17h19   #9
Membre du Club
 
Inscription : avril 2004
Messages : 54
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 54
Points : 59
Points : 59
Par défaut Re: PB de débutant SQL en environnement DB2

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
           a.CLASSE , count( * )
FROM
        ( SELECT
                     case
                        when Niv_Risq BETWEEN 0 AND 99 then 'Classe 1'
                        when Niv_Risq BETWEEN 100 AND 200 then 'Classe2'
                        When .........
                         else 'Classe X'
                     end CLASSE
           FROM
                     client
         ) AS a
GROUP BY
          a.CLASSE
Mais la methode à utiliser passe par une bonne modélisation
Table N_RISQUE des niveaux de risque +
Table C_RISQUE des classes de risque

Une table RISQUE peut suffire si Niv_risq entre deux bornes numériques
Classe_risq Libelle
99 classe 1
199 classe 2
999 Classe X

Un NIV_RISQ ne pouvant etre créé dans client si une CLASSE_RISQ >= n'existe pas dans RISQUE

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
           b.libelle , count( * )
FROM 
        ( SELECT
                     min( b.classe_risq ) classe_risq
          FROM
                     client         a ,
                     risque     b 
          WHERE
                     b.classe_risq >= a.niv_risq
        ) AS a
      INNER JOIN
         risque b
      ON
          b.classe_risq = a.classe_risq
GROUP BY
          b.libellé
papounet 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 12h36.


 
 
 
 
Partenaires

Hébergement Web