CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[SQL] Exo case

cybevil
cybevil
Niveau 27
20 novembre 2020 à 00:22:57

Bonjour, je dois réaliser des exercices sur les requêtes SQL pour un de mes cours seulement je bloques sur les 2 derniers exos.

Pour le premier, j'ai une table "pilote" qui ressemble à ceci :

https://image.noelshack.com/fichiers/2020/47/5/1605827814-01.png

La consigne : Affichez le nombre de pilotes pour chacune des catégories suivantes : pilote débutant (moins
de 250 heures de vol), pilote expérimenté (entre 250 et 1700 heures de vol) et pilote expert
(plus de 1700 heures de vol).

Résultat à obtenir :

https://image.noelshack.com/fichiers/2020/47/5/1605828055-capture002.png

Du coup je partais sur une requête qui ressemble à ça mais je patauge un peu, quelqu'un saurais m'aguiller ? :

select case when nbheures < 250 then 'pilote débutant' when nbheures >= 250 and nbheures <= 1700 then 'pilote expérimenté' when nbheures > 1700 then 'pilote expert' end as 'Type pilote' from pilote;
cybevil
cybevil
Niveau 27
20 novembre 2020 à 01:25:22

J'ai finalement trouvé une solution, malgré qu'elle soit un peu longue, si vous avez plus court, je suis preneur.

select case 
	when nbheures < 250 then 'pilote débutant' 
	when nbheures >= 250 and nbheures <= 1700 then 'pilote expérimenté' 
	when nbheures > 1700 then 'pilote expert' 
	end as 'Type pilote', count(
		case 
			when nbheures < 250 then 'pilote débutant' 
			when nbheures >= 250 and nbheures <= 1700 then 'pilote expérimenté' 
			when nbheures > 1700 then 'pilote expert' end) 
				as tot from pilote group by 
					case 
						when nbheures < 250 then 'pilote débutant' 
						when nbheures >= 250 and nbheures <= 1700 then 'pilote expérimenté' 
						when nbheures > 1700 then 'pilote expert' end;
cybevil
cybevil
Niveau 27
20 novembre 2020 à 01:36:36

Pour le deuxième exercice voici la consigne :

Affichez, pour chaque place, son prix ainsi que son prix à la minute de vol.

Table place :

https://image.noelshack.com/fichiers/2020/47/5/1605832131-ex2place.png

Table vol :

https://image.noelshack.com/fichiers/2020/47/5/1605832388-ex2vol.png

Résultat à obtenir :

https://image.noelshack.com/fichiers/2020/47/5/1605832437-ex2volresult.png

Pour cet exercice, j'arrive à afficher les 3 premières colonnes, seulement la 3ème demande d'accéder à 2 table en même temps pour réaliser la division du prix des places par la durée en minute afin d'obtenir le prix à la minute et je sèche complètement sur la manière de faire... Une idée ?

Le début de ma commande :

select numplace, concat(indcomp, numvol) as 'Numéro de vol', prixplace from place;
cybevil
cybevil
Niveau 27
20 novembre 2020 à 02:19:57

2ème exercice résolu, n'hésitez pas à réagir si vous avez une meilleur façon de faire :ok: :

select p.numplace, concat(p.indcomp, p.numvol) as 'Numéro de vol', p.prixplace, p.prixplace/TIME_TO_SEC(v.dureevol)*60 as 'Prix à la minute' 	
	from place as p
	inner join vol as v
	on p.numvol = v.numvol
	where concat(p.indcomp, p.numvol) = concat(v.indcomp, v.numvol);
Chocolayte
Chocolayte
Niveau 73
20 novembre 2020 à 17:06:48

Pour le premier, tu peux procéder ainsi

select
  case
    when nbheures < 250 then 'pilote débutant'
    when nbheures >= 250 and nbheures <= 1700 then 'pilote expérimenté'
    when nbheures > 1700 then 'pilote expert'
  end as 'Type pilote',
  count(1) as 'Total'
from
  pilote
group by
  1;

count(1) renvoie au compte de la première colonne
group by 1 dicte de grouper selon les valeurs de la première colonne

(Étonnamment, cette syntaxe ne fonctionne pas avec Oracle mais je doute que tu l'utilises).

_

Pour le second, tu n'es pas obligé d'utiliser concat. Je te recommanderais plutôt cette syntaxe qui surcharge les conditions de la jointure et qui est plus commune

select 
   p.numplace, 
   concat(p.indcomp, p.numvol) as 'Numéro de vol', 
   p.prixplace, 
   p.prixplace/TIME_TO_SEC(v.dureevol)*60 as 'Prix à la minute'    
from 
    pilote as p
    inner join vol as v on p.numvol = v.numvol and p.indcomp = v.indcomp;

Ce n'est pas quelque chose qui arrivera avec tes données mais abandonne ce réflexe car dans le futur, tu pourrais avoir un problème du genre avec la concaténation. Considérons que tu aies les lignes suivantes :

indcomp = 'LUF1' et numvol = 1
indcomp = 'LUF' et numvol = 11

Les deux concaténations renverront LUF11. Alors méfiance.

_

Et pour finir dans le cadre d'une jointure classique (inner join),

from 
    pilote as p
    inner join vol as v on p.numvol = v.numvol and p.indcomp = v.indcomp;

Est identique à

from 
    pilote as p
    inner join vol as v on p.numvol = v.numvol 
where
    p.indcomp = v.indcomp;

Et

from 
    pilote as p
    inner join vol as v on p.indcomp = v.indcomp 
where
    p.numvol = v.numvol;

Et

from 
    pilote as p,
    vol as v
where
    p.numvol = v.numvol 
    and p.indcomp = v.indcomp;

(corrigez moi si je dis une bêtise, le SQL n'est pas mon domaine d'expertise, mais il me semble bien qu'il y a équivalence :noel: )

Message édité le 20 novembre 2020 à 17:11:04 par Chocolayte
Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment