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

Langage SQL Discussion :

Problème Requete avec MAX()


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 11
    Points
    11
    Par défaut Problème Requete avec MAX()
    Bonjours à tous voilà étant donné mon niveau en SQL je vous demande de l'aide car là j'ai du mal...

    Voila tout d'abord à quoi ressemble les 2 tables concernées:

    RISQUE(id_risque,libelle_risque)
    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
     
    1  	Eclairage
    2 	Bruit
    3 	Température
    4 	Concentration poussières, vapeurs
    5 	Chutes de plain-pied
    6 	Circulation (organisation des flux)
    7 	Ecran de visualisation
    8 	Elèctricité
    9 	Engins et appareils de levage
    10 	Incendies, Explosions
    11 	Interventions entreprises extérieures
    12 	Machines et équipements
    13 	Manutention manuelle
    14 	Rayonnements ionisants
    15 	Rayonnements non-ionisants
    16 	Substances et préparations dangereuses
    17 	Travail isolé
    18 	Travaux en hauteur
    19 	Autres
    DANGER(id_danger, id_categ, id_risque, libelle_danger, criticite_gravite, criticite_frequence, criticite_totale_actuelle, date_ajout_danger)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    1  	16  	2  	Pas de ligne de vie  					3  	3  	4  	2007-02-12
    3 	15 	17 	Parking élève trop emcombré 				2 	3 	3 	2007-03-05
    4 	6 	14 	Câbles électriques dans la salle 			3 	3 	4 	2007-02-13
    5 	9 	12 	Machine dégagant une forte chaleur pouvant bruler 	2 	2 	3 	2007-03-18
    6 	17 	11 	Nuisances sonores élevées 				1 	2 	2 	2007-03-04
    7 	18 	8 	Produits dangereux abondants 				3 	1 	3 	2007-01-15
    8 	16 	16 	nouveau danger 						3 	3 	4 	2007-03-26
    Donc en gros ici un danger est caractérisé par entre autres par un id_risque et par un id_categ

    Ce que je voudrais c'est que pour un id_categ donné on me ressorte la liste de TOUS les risques et qu'il y ai en face de chaque risque le maximum des criticite_totale _actuelle ou rien s'il n'y pas de dangers affecté à ce risque.


    Voila là requete que j'ai pour l'instant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT id_categ,risque.id_risque,libelle_risque,MAX(criticite_totale_actuelle) AS max
    FROM danger
    LEFT JOIN risque ON danger.id_risque = risque.id_risque
    WHERE id_categ=6 
    GROUP BY risque.id_risque
    Mais avec cette requete ça me ressort bien les risques avec la criticite maximum mais je voudrais avoir ausi les autres risques qui n'ont pas de criticité affectée:

    J'obtiens ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    id_categ   id_risque   	libelle_risque   	 			max
    6 		5 	Chutes de plain-pied 				3
    6 		8 	Elèctricité 					4
    6 		14 	Rayonnements ionisants 				4
    6 		15 	Rayonnements non-ionisants 			4
    6 		16 	Substances et préparations dangereuses 		2
    Et moi je voudrais ça:
    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
     
    id_categ	id_risque   	 libelle_risque					max
    6		1 		Eclairage					0
    6		2 		Bruit						0
    6		3 		Température					0
    6		4 		Concentration poussières, vapeurs		0
    6		5 		Chutes de plain-pied				3
    6		6 		Circulation (organisation des flux)		0
    6		7 		Ecran de visualisation				0
    6		8 		Elèctricité					4
    6		9 		Engins et appareils de levage			0
    6		10 		Incendies, Explosions				0
    6		11 		Interventions entreprises extérieures		0
    6		12 		Machines et équipements				0
    6		13 		Manutention manuelle				0
    6		14 		Rayonnements ionisants				4
    6		15 		Rayonnements non-ionisants			4
    6		16 		Substances et préparations dangereuses		2
    6		17 		Travail isolé					0
    6		18 		Travaux en hauteur				0
    6		19 		Autres						0
    Si quelqu'un a quelque chose à me proposer ça serait super. Merci d'avance à tous. A+

  2. #2
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    et ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id_categ,risque.id_risque,libelle_risque,
    MAX(case when id_categ=6 then criticite_totale_actuelle else 0 end) AS max
    FROM danger
    LEFT JOIN risque ON danger.id_risque = risque.id_risque
    AND id_categ=6 
    GROUP BY risque.id_risque
    En fait ta clause where transformait ton LEFT en INNER. Donc j'ai remonté ta clause dans la jointure externe.

    Par contre cela doit être encore un peu inexact, car dans ton exemple on ne voit que id_categ=6 dans ta colonne de gauche alors que dans ma requête non.

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Salut phili_b et merci

    Oui en effet on ne voit pas l'id_categ = 6 car je voulais pas poster toute ma table

    Je vais regarder ce que tu vietn de me donner.
    S'il y a d'autres propositions je suis prenneur.

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Apparement la requête ne fonctionne pas tellement ça me renvoie la même chose qu'avant avec une ligne en plus qui correspond à je ne sais pas trop quoi.

    Il n'y aurait pas une solution plus facile qu'avec des conditions?

    Merci d'avance

  5. #5
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    En lisant un peu moins vite ta demande, en fait tu veux les catégories et afficher les risques seulement s'ils existent mais en ne prenant que le max de criticité. Mais il manque une table risque dont tu n'as pas parlé. En effet dans ta table danger il n'y a que les associations de catégorie et de risques existants, et non toutes les associations possibles. Il manquera donc des catégories qui ne sont pas dans la table d'association Danger.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT Categorie.id_categorie,risque.id_risque,Risque.libelle_risque,
    MAX(nvl(criticite_totale_actuelle,0)) 
    FROM Categorie
    LEFT JOIN Danger ON Categorie.id_categorie=Danger.id_categorie
    LEFT JOIN Risque ON Danger.id_risque = Risque.id_risque
    GROUP BY Categorie.id_categorie,risque.id_risque,Risque.libelle_risque

    quel SGBD ? nvl(y,0) sous oracle est équivalent, en SQL standard, à (case when y is null then 0 else y end)

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bonjours phili_b je vais mieux t'expliquer ma demande car j'ai du mal m'exprimer.

    Voici mes 3 tables:

    CATEGORIE(id_categ, libelle_categ, id_categ_fk)

    DANGER(id_danger, #id_categ, #id_risque, libelle_danger, criticite_gravite, criticite_frequence, criticite_totale_actuelle, date_ajout_danger)

    RISQUE(id_risque,libelle_risque)

    Donc un danger appartient à un type de risque et à 1 catégorie (ici ce sont des lieux)

    Exemple:
    Salle224(Catégorie) - Problème avec prise élec (Danger) - Electricité(Risque)
    4(Criticité)

    Voila les renseignements qui m'interesse.

    Donc on peut avoir plusieurs danger ayant le même type de risque dans une catégorie(il peut y avoir plusieurs dangers liés à l'électricité dans ma salle 224)

    Voici une bonne partie de ma table DANGER histoire de voir à quoi ça ressemble:

    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
     
    id_danger    id_categ   	 id_risque   	 libelle_danger   	 				criticite_gravite   	 criticite_frequence   	 criticite_totale_actuelle   	 date_ajout_danger
    1 		16 		2 		Pas de ligne de vie 						3 			3 			4 			2007-02-12
    3 		15 		17 		Parking élève trop emcombré 					2 			3 			3 			2007-03-05
    4 		6 		14 		Câbles électriques dans la salle 				3 			3 			4 			2007-02-13
    5 		9 		12 		Machine dégagant une forte chaleur pouvant bruler 		2 			2 			3 			2007-03-18
    6 		17 		11 		Nuisances sonores élevées 					1 			2 			2 			2007-03-04
    7 		18 		8 		Produits dangereux abondants 					3 			1 			3 			2007-01-15
    8 		16 		16 		nouveau danger 							3 			3 			4 			2007-03-26
    9 		16 		16 		nouveau danger 							1 			1 			1 			2007-03-26
    17 		16 		8 		super danger!! 							1 			1 			1 			2007-03-27
    16 		16 		10 		ça c'est un danger!! 						1 			2 			2 			2007-03-27
    18 		16 		8 		super danger!! 							3 			3 			4 			2007-03-27
    19 		16 		1 		testttt 							1 			1 			1 			2007-03-27
    20 		16 		1 		testttt 							1 			1 			1 			2007-03-27
    21 		16 		1 		eeeeeeee 							1 			1 			1 			2007-03-27
    22 		14 		17 		Pas assez de places 						1 			3 			2 			2007-03-27
    23 		12 		11 		danger 								3 			2 			4 			2007-03-27
    24 		6 		5 		ssssss 								3 			1 			3 			2007-03-30
    25 		6 		15 		mauvais éclairage 						2 			2 			3 			2007-04-10
    26 		6 		15 		manque un store sur fenêtre 					2 			2 			4 			2007-04-25
    27 		6 		16 		danger dans la salle 224!!! 					2 			1 			2 			2007-04-06
    28 		6 		15 		bbbbbb 								2 			2 			3 			2007-04-06
    29 		6 		8 		hnijvhpmgpm 							3
    Du côté code php Je vais généré la requete avec un WHERE id_categ = $macateg

    Donc moi ce qui m'interesserait ça serait d'avoir dans une colonne la liste de tous les risques (il y en a 19) et en face de chacun des risques la criticité_totale_actuelle maximale de tous les dangers qui appartiennent à ce risque.

    Exemple:
    Si on regarde ma table danger et que l'on prend la categ 16 on voit qu'il y a plusieurs dangers appartenant aux risque 1 et 8 par exemple.

    Donc la première étape est de récupérer le MAX de la criticite_totale_actuelle pour les risques renseignés ( Exemple pour la categ 16 et le risque 8 on a des criticite_totale_actuelle : 3-3-1. Donc le MAX sera 3

    Voici ce que j'aimerais en sortie pour la categ 16 passée dans un WHERE:

    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
     
    id_risque   	 libelle_risque					MAX
    1 		Eclairage					1
    2 		Bruit						4
    3 		Température					NULL	
    4 		Concentration poussières, vapeurs		NULL
    5 		Chutes de plain-pied				NULL
    6 		Circulation (organisation des flux)		NULL
    7 		Ecran de visualisation				NULL
    8 		Elèctricité					4
    9 		Engins et appareils de levage			NULL
    10 		Incendies, Explosions				2
    11 		Interventions entreprises extérieures		NULL
    12 		Machines et équipements				NULL
    13 		Manutention manuelle				NULL
    14 		Rayonnements ionisants				NULL
    15 		Rayonnements non-ionisants			NULL
    16 		Substances et préparations dangereuses		4
    17 		Travail isolé					NULL
    18 		Travaux en hauteur				NULL
    19 		Autres						NULL
    J'espère avoir été un peu pus clair en tout cas je te remercie encore pour ton aide

Discussions similaires

  1. [SQL Server] Requete avec MAX et group by
    Par joKED dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/01/2007, 13h00
  2. Requete avec max et group by
    Par Maxime555 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/07/2006, 11h48
  3. [MySQL] Problème requete avec un count
    Par kornmuse90 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/03/2006, 08h56
  4. Requete avec Max
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 11
    Dernier message: 16/01/2006, 10h59
  5. Pb requete avec MAX
    Par Karibou dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 18/08/2005, 14h05

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