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

Développement SQL Server Discussion :

Requête sur Date récente [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Apprenti en développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Apprenti en développement logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 67
    Points : 97
    Points
    97
    Par défaut Requête sur Date récente
    Bonjour,

    Je vous explique mon problème :

    J'ai 2 tables :
    ORGANISATEUR (id_org, prenom, nom)
    FETE (id_fete, #id_org, lieu, date)

    et j'essaie de faire une requete me donnant la date la plus récente pour 2 entrée identique.

    Exemple :
    +-----------+----------+---------------------------------+
    | Prenom | NOM | DATE
    +-----------+----------+---------------------------------+
    | Jean | Jean | 2013-02-28 10:59:06.000
    +-----------+----------+---------------------------------+
    | Jean | Jean | 2012-05-25 10:59:06.000
    +-----------+----------+---------------------------------+


    Ce que je voudrais avoir est le premier enregistrement (c'est a dire le plus récent). J'ai vu sur d'autre réponse la fonction max mais je n'arrive pas l'utiliser pour avoir le résultat souhaité.

    J'ai bien fait cette requête mais le AND ne va pas du tout, il faudrais que je le change a chaque fois ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ORGANISATEUR.prenom, ORGANISATEUR.nom, FETE.date
    FROM ORGANISATEUR, FETE
    WHERE ORGANISATEUR.id_org=FETE.id_org
    AND FETE.date='28/02/2013 10:59:06.000';
    Si vous pouviez me donner une piste, je vous en serais reconnaissant.

    Cordialement.
    M4itreG

  2. #2
    Membre averti
    Avatar de taibag
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 214
    Points : 357
    Points
    357
    Billets dans le blog
    1
    Par défaut
    Pourquoi vous utilisez where, l’ancienne syntaxe de jointure SQL , il est conseillé d’utiliser join pour les jointures :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
     t1.prenom
    ,t1.nom
    ,max(t2.date)
    FROM ORGANISATEUR t1 inner join FETE t2
        ON t1.id_org=t2.id_org
    मैं एक छात्र हूँ |

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par taibag Voir le message
    Pourquoi vous utilisez where, l’ancienne syntaxe de jointure SQL , il est conseillé d’utiliser join pour les jointures :

    Code sql :
    Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t1.prenom ,t1.nom ,max(t2.date) FROM ORGANISATEUR t1 INNER JOIN FETE t2 ON t1.id_org=t2.id_org
    Faire la jointure dans la clause WHERE ou dans une clause JOIN (doit) revenir exactement au même. Sans cela, je changerais de SGDBR.

    Pour revenir au problème, je pense que la requête qu'il vous faut est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT
            ORG.PRENOM,
            ORG.NOM,
            MAX(FET.DATE)
    FROM
            DBO.ORGANISATEUR ORG
                INNER JOIN DBO.FETE FET
                    ON ORG.ID_ORG = FET.ID_ORG
    GROUP BY
            ORG.PRENOM,
            ORG.NOM
    Il se trouve que je suis un adepte des clauses JOIN car je trouve cela plus lisible. Je préfère laisser à la clause WHERE ce qui relève "uniquement" du filtrage de données (ie. si on ne voulait qu'un organisateur précis par exemple).

    Pour information, lors de l'utilisation d'une fonction d'agrégation (MAX dans ce cas-ci), il est alors obligatoire que chaque autre colonne figurant dans la clause SELECT soit :

    • également l'objet d'une fonction d'agrégation
    • reprise dans la clause GROUP BY
    Kropernic

  4. #4
    Membre régulier
    Homme Profil pro
    Apprenti en développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Apprenti en développement logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 67
    Points : 97
    Points
    97
    Par défaut
    Pourquoi vous utilisez where, l’ancienne syntaxe de jointure SQL , il est conseillé d’utiliser join pour les jointures :
    Tout bêtement car j'ai appris ainsi et je n'ai jamais eu de problème mais il est vrai que je vais penser a apprendre la nouvelle norme, pour vivre avec mon temps :p.

    Cette écriture change quelque chose ? ou c'est simplement juste une façon de l'écrire plus lisiblement ?

    Revenons à nos moutons :

    Ce que tu me propose je l'ai déjà testé mais à chaque fois cette erreur revient :

    Msg*8120, Niveau*16, État*1, Ligne*1
    Column 'FETE.date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


    Voilà pourquoi je me demandais si il n'y avait pas une autre façon.

    Une question bête : ce n'est pas ma norme de jointure qui m'interdit la fonction max ?

    Merci de ton aide.
    Cordialement.

    M4itreG

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    J'ai oublié de le précisé mais attention à l'utilisation de mots réservés comme nom de colonne.

    Le mot "date" pour un nom de colonne est donc à éviter. Si vraiment nécessaire, pour éviter tout problème, mettez le alors entre crochet à chaque utilisation.
    Kropernic

  6. #6
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par M4itreG Voir le message
    Cette écriture change quelque chose ? ou c'est simplement juste une façon de l'écrire plus lisiblement ?
    Pour les jointures du type INNER JOIN, aucun problème à part le fait que c'est moins lisible.
    Mais pour les jointures du type LEFT JOIN/RIGHT JOIN. Comment fais tu ? Les *= ou =* ne fonctionnent plus depuis Sql Server 2000 (à moins d'être en compatibilité 80, ce qui n'est pas possible avec SQL 2012)
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  7. #7
    Membre régulier
    Homme Profil pro
    Apprenti en développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Apprenti en développement logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 67
    Points : 97
    Points
    97
    Par défaut
    Pendant que je répondais au premier post, tu as posté donc je te réponds.

    Citation Envoyé par Kropernic Voir le message
    Faire la jointure dans la clause WHERE ou dans une clause JOIN (doit) revenir exactement au même. Sans cela, je changerais de SGDBR.
    Merci pour cette précision.

    Citation Envoyé par Kropernic Voir le message
    Il se trouve que je suis un adepte des clauses JOIN car je trouve cela plus lisible. Je préfère laisser à la clause WHERE ce qui relève "uniquement" du filtrage de données (ie. si on ne voulait qu'un organisateur précis par exemple).
    Cette norme d'écriture est effectivement bien car elle sépare bien la jointure du filtrage. Au premier abord elle parait quand même un peu lourde je trouve mais je vais m'y pencher.



    Pour ce qui est de ta solution :

    C'est parfait cela fonctionne très bien. Et maintenant je comprend mieux, le message d'erreur m'indiquant le "GROUP BY clause".

    Donc si je situe bien la chose :
    Si j'utilise une fonction d'agrégat dans le SELECT et que j'ai N colonnes. Il me faudra un GROUP BY avec N-1 colonnes. ?



    Merci de ton aide Korpernic.
    Cordialement.

    M4itreG

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par M4itreG Voir le message
    Donc si je situe bien la chose :
    Si j'utilise une fonction d'agrégat dans le SELECT et que j'ai N colonnes. Il me faudra un GROUP BY avec N-1 colonnes. ?
    S'il y a au moins 1 fonction d'agrégation (MIN, MAX, AVG, COUNT, etc.) dans la clause SELECT, alors il faut effectuer un regroupement (GROUP BY) pour chaque colonne ne faisant pas l'objet d'une fonction d'agrégation.

    Il est tout à fait possible d'avoir plusieurs fonctions d'agrégation. Si par exemple tu voulais aussi avoir la date de la fête la plus ancienne d'un organisateur, il te suffirait ici d'ajouter MIN(FET.DATE) dans la clause SELECT de la requête que j'ai proposée.

    Citation Envoyé par M4itreG Voir le message
    Merci de ton aide Korpernic.
    Ravi d'avoir pu aider.
    Kropernic

  9. #9
    Membre régulier
    Homme Profil pro
    Apprenti en développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Apprenti en développement logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 67
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    J'ai oublié de le précisé mais attention à l'utilisation de mots réservés comme nom de colonne.

    Le mot "date" pour un nom de colonne est donc à éviter. Si vraiment nécessaire, pour éviter tout problème, mettez le alors entre crochet à chaque utilisation.
    Merci du conseil. Je ne savais pas, je vais donc mettre DateFete.



    Citation Envoyé par darkelend
    Pour les jointures du type INNER JOIN, aucun problème à part le fait que c'est moins lisible.
    Mais pour les jointures du type LEFT JOIN/RIGHT JOIN. Comment fais tu ? Les *= ou =* ne fonctionnent plus depuis Sql Server 2000 (à moins d'être en compatibilité 80, ce qui n'est pas possible avec SQL 2012)
    Comme tu peux le voir, je suis assez débutant donc je n'ai pas eu encore l'occasion d'utiliser LEFT JOIN/RIGHT JOIN. Donc je n'ai pas pu me retrouver devant le mur mais comme je l'ai écrit plus haut je vais me mettre à la nouvelle écriture qui est bien plus structuré, bien que compliquée a première vue.

    Cordialement.

    M4itreG

  10. #10
    Membre régulier
    Homme Profil pro
    Apprenti en développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Apprenti en développement logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 67
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    S'il y a au moins 1 fonction d'agrégation (MIN, MAX, AVG, COUNT, etc.) dans la clause SELECT, alors il faut effectuer un regroupement (GROUP BY) pour chaque colonne ne faisant pas l'objet d'une fonction d'agrégation.

    Il est tout à fait possible d'avoir plusieurs fonctions d'agrégation. Si par exemple tu voulais aussi avoir la date de la fête la plus ancienne d'un organisateur, il te suffirait ici d'ajouter MIN(FET.DATE) dans la clause SELECT de la requête que j'ai proposée.
    D'accord j'ai compris. Merci encore de ton aide et aussi de celle des 2 autres personnes qui ont pris le temps de me répondre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [REQ] Requête sur date et heure
    Par benazerty dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/06/2006, 13h34
  2. [sql server] requête sur dates et heures (format du résultat
    Par isachat666 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/02/2006, 13h48
  3. Requète sur dates compliquée ...
    Par itklif2 dans le forum Requêtes
    Réponses: 7
    Dernier message: 28/11/2005, 23h31
  4. [ADO] Requète sur dates
    Par cdlr27 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/01/2005, 22h39
  5. Requête sur date
    Par guenfood dans le forum Access
    Réponses: 11
    Dernier message: 08/12/2004, 16h11

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