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 :

Requêtes sql, help me plz!


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut Requêtes sql, help me plz!
    Bonjour tous le monde,je cherche à faire des requêtes pour un taf pour lundi et je bloque toujours sur les sous requêtes et les dates et encore pour les jointures :s ,si quelqu'un a la gentillesse de m'aider,

    MCD:



    1.il me faut effacer de la table notation les lignes suivanes ( couple numero_stagiaire et code_module ) : (1,102),(2,101)

    2.Afficher quel etait la moyen d'age pour les stagiaires au premier janvier 2009.

    3.Afficher le nom des couples, nom du garçon nom de la fille, dont la difference d'age ne dépasse pas 6mois (180jours).

    4.pour les stagiaires n'ayant pas de notes dans un module, afficher le numero le nom le titre du module concerné.

    y'en a d'autre mais ils sont moin dur,

    cordialement !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Pour t'aider, il nous faudrait la structure de tes tables.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Il nous faudrait aussi le type de sgbdr que tu utilises pour les requêtes sur les dates.

  4. #4
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par toxtes Voir le message
    Pour t'aider, il nous faudrait la structure de tes tables.
    Que veux tu dire par structure? es le MLD?
    Citation Envoyé par toxtes Voir le message
    Il nous faudrait aussi le type de sgbdr que tu utilises pour les requêtes sur les dates.
    j'utilise SQL server management studio 2005

    Merci pour ta réponse.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Avant que nous ne resolvions tes exercices, peux-tu nous montrer ce que tu as essayé?
    La première question ne semble pas très difficile par exemple.

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Bonjour,

    Avant que nous ne resolvions tes exercices, peux-tu nous montrer ce que tu as essayé?
    La première question ne semble pas très difficile par exemple.
    pas de probleme effectivement j'ai fais la premiere question mais sans les sous requetes :s :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete notation where numero_stagiaire=2 and code_module=102
    et ainsi de suite..

    pour l'age moyen je sais pas trop comment inserer une dattediff dans une avg():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom_stagiaire,avg(datediff(day,01/01/2009,getdate()) / 365,25) as MoyeonDAge from stagiaire
    pour la 3eme question je crois qu'il faut mettre une 'if'
    merci pour ta réponse.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    pas de probleme effectivement j'ai fais la premiere question mais sans les sous requetes :s :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE notation WHERE numero_stagiaire=2 AND code_module=102
    Quelle sous-requête? Et vos conditions ne correspondent pas à l'ennoncé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM notation WHERE (numero_stagiaire=1 AND code_module=102) OR (numero_stagiaire=2 AND code_module=101)
    pour l'age moyen je sais pas trop comment inserer une dattediff dans une avg():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom_stagiaire,avg(datediff(day,01/01/2009,getdate()) / 365,25) AS MoyeonDAge FROM stagiaire
    Déjà, pourquoi demander la différence en jours si c'est pour la transformer en années?
    Ensuite, vous faites la différence entre aujourd'hui et le 1 janvier 2009... faites la plutôt entre date_naissance et le 1 janvier 2009.
    Vous calculez une moyenne sur l'ensemble des stagiaires, inutile donc d'inclure nom_stagiaire dans votre SELECT.

    Pour la troisième, pas besoin de IF, qui n'existe d'ailleurs pas en SQL.
    Si j'ai bien compris la question, il faudra faire un produit cartesien entre l'ensemble des stagiaires filles et l'ensemble des stagiaires garçons, et poser la condition que la valeur absolue de la différence des date_naissance ne dépasse pas 180 jours.

  8. #8
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Quelle sous-requête? Et vos conditions ne correspondent pas à l'ennoncé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM notation WHERE (numero_stagiaire=1 AND code_module=102) OR (numero_stagiaire=2 AND code_module=101)

    Déjà, pourquoi demander la différence en jours si c'est pour la transformer en années?
    Ensuite, vous faites la différence entre aujourd'hui et le 1 janvier 2009... faites la plutôt entre date_naissance et le 1 janvier 2009.
    Vous calculez une moyenne sur l'ensemble des stagiaires, inutile donc d'inclure nom_stagiaire dans votre SELECT.

    Pour la troisième, pas besoin de IF, qui n'existe d'ailleurs pas en SQL.
    Si j'ai bien compris la question, il faudra faire un produit cartesien entre l'ensemble des stagiaires filles et l'ensemble des stagiaires garçons, et poser la condition que la valeur absolue de la différence des date_naissance ne dépasse pas 180 jours.
    dabord merci pour la correction
    pour la 2éme question fallait pas diviser 365 , j'ai fais ça mais ça na pas marcher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom_stagiaire,avg(datediff(year,date_stagiaire,01/01/2009)) as age from stagiaire group by nom_stagiaire

    MErci encore!

  9. #9
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    Pour Delete ça a marcher, j'aurais jamais pensé a faire un or entre les couples MErci professeur !

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Encore une fois, ne selectionnez pas nom_stagiaire alors que vous cherchez une moyenne sur l'ensemble des stagiaires.
    AVG est une fonction d'aggregation qui calcule la moyenne d'une valeur sur un ensemble. Ca n'a pas de sens de calculer la moyenne d'age par stagiaire, chaque stagiaire n'a qu'un age en principe
    Aussi, utilisez CAST ou CONVERT pour exprimer la date du 1er janvier 2009. Et les chaînes de caractères sont encadrés par des ' en SQL.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(datetime, '01/01/2009', 103)
    En passant, c'est date_naissance dans votre MCD, pas date_stagiaire.

  11. #11
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    j'ai selectioné le nom_stagiaire pour regrouper ma selection sur les noms sinon je crois que ca va donner juste des nombres,dailleurs j'ai fais votre requetes et j'ai une une nouvel colonne avec (01/01/2009.....) du coup toutes les lignes ont cet valeur !?? (pourquoi 103?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom_stagaire,convert(datetime,'01/01/2009',103) from stagiaire group by nom_stagiaire
    non je me suis trompé faut avoir qu'une seul colonne avec la moyen d'age

  12. #12
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    Citation Envoyé par server16 Voir le message
    (pourquoi 103?)
    il suffit de lire le lien que ta donné Snipah pour répondre à cette question

  13. #13
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Cybher Voir le message
    il suffit de lire le lien que ta donné Snipah pour répondre à cette question
    c'est bon merci !

  14. #14
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Encore une fois, ne selectionnez pas nom_stagiaire alors que vous cherchez une moyenne sur l'ensemble des stagiaires.
    AVG est une fonction d'aggregation qui calcule la moyenne d'une valeur sur un ensemble. Ca n'a pas de sens de calculer la moyenne d'age par stagiaire, chaque stagiaire n'a qu'un age en principe
    Aussi, utilisez CAST ou CONVERT pour exprimer la date du 1er janvier 2009. Et les chaînes de caractères sont encadrés par des ' en SQL.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(datetime, '01/01/2009', 103)
    En passant, c'est date_naissance dans votre MCD, pas date_stagiaire.
    mais comment faire convert sans mettre la date de naissance du stagiaire?
    merci pour la remarque de la date_stagiaire !

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Datediff donne la différence entre deux dates.
    '01/01/2009' n'est pas une date, c'est une chaîne de caractère. Elle sera convertie implicitement si elle correspond au format de date standard de votre base, mais autant faire les choses proprement en utilisant CONVERT ou CAST.
    On veut donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avg(datediff(year,date_naissance,CONVERT(datetime, '01/01/2009', 103)))
    A vérifier, car je n'utilise pas SQL Server.

  16. #16
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Datediff donne la différence entre deux dates.
    '01/01/2009' n'est pas une date, c'est une chaîne de caractère. Elle sera convertie implicitement si elle correspond au format de date standard de votre base, mais autant faire les choses proprement en utilisant CONVERT ou CAST.
    On veut donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avg(datediff(year,date_naissance,CONVERT(datetime, '01/01/2009', 103)))
    A vérifier, car je n'utilise pas SQL Server.
    ça ma donner l'erreur suivante: Msg208, Level 16 state 1, Line 1 Nom d'objet 'STAGIAIRE' non valide (celui de date_stagaire)

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Vous avez bien lancé la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT avg(datediff(year,date_naissance,CONVERT(datetime, '01/01/2009', 103)))
    FROM STAGIAIRE
    Si c'est le cas, la table n'existe pas?

  18. #18
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Vous avez bien lancé la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT avg(datediff(year,date_naissance,CONVERT(datetime, '01/01/2009', 103)))
    FROM STAGIAIRE
    Si c'est le cas, la table n'existe pas?
    mais si

  19. #19
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Points : 3
    Points
    3
    Par défaut
    Enfét j'ai oublier de changer la table master par ma table sinon ça a marcher
    pour la 3éme question je n'arrive toujours pas a la resoudre :
    je sais que pour calculer la difference en procedure on fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare @debut datetime
    declare @fin datetime
    set @debut= '16/10/1987'
    set @fin='01/01/2009'
    select datediff(year,@debut,@fin)
    go
    mais comment faire pour que la date d'aujourd'ui s'ecrit toute seul (sans declarer la date du jour debut='07/11/2009' ??)

Discussions similaires

  1. Résolution requête SQL Help!
    Par mnemonic78 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/02/2011, 10h09
  2. Help Requêtes SQL
    Par bishope dans le forum Langage SQL
    Réponses: 9
    Dernier message: 05/02/2008, 10h17
  3. [débutant] Help requète sql
    Par eric8787 dans le forum VB.NET
    Réponses: 5
    Dernier message: 10/12/2007, 23h12
  4. [DataBase][SQL] Help pour ma requête
    Par ice69 dans le forum JBuilder
    Réponses: 2
    Dernier message: 27/04/2006, 19h53
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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