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

SQL Oracle Discussion :

Utiliser une date formatée avec trunc dans une combinaison de requêtes


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juin 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2017
    Messages : 37
    Points : 23
    Points
    23
    Par défaut Utiliser une date formatée avec trunc dans une combinaison de requêtes
    Bonjour,
    Je ne parviens pas à écrire la requête de sorte à utiliser la fonction "trunc(achat.date_achat)" deux fois.
    La première fois il me sert à combiner des lignes (genre de doublons) la deuxième fois j'ai juste besoin d'afficher la date dans le résultat final.

    Sauf que j'ai un message "ORA-00904 - Identificateur non valide"

    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
     
     
    SELECT user.user_identifiant,  user.user_nom, user.user_prenom, trunc(achat.achat_date)
     
    FROM (
    SELECT user.user_identifiant,  user.user_nom, user.user_prenom, type.type_code, trunc(achat.achat_date)
    FROM tab_achat achat
    JOIN tab_user user ON achat.achat_id_usr = user.user_id_user
    JOIN tab_type type ON achat.achat_id_type = type.type_id_type
    WHERE achat.achat_date > '01/01/2020'
    GROUP BY user.user_identifiant,  user.user_nom, user.user_prenom, type.type_code, trunc(achat.achat_date)
    HAVING COUNT(user.user_identifiant) >= 2 
    )
     
    ORDER BY user.user_nom, user.user_prenom
    Interprétation :
    Le premier SELECT me permet de rassembler les types redondants et le second à faire les noms des users ayant des types différents à la même date (au jour près car je ne souhaite pas regarder l'heure).
    Donc je me passe du champ type dans le second SELECT.



    Je ne suis pas très à l'aise sur le SQL, mais j'essaie d'apprendre et de m'améliorer.

    Je vous remercie.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    quand tu utilises une vue imbriquée il faut utiliser des alias pour tes expressions pour pouvoir les référencer dans la requête principale. De plus tu ne pourras pas référencer un alias de table se trouvant à l'intérieur de ta vue imbriqué dans la requête globale. Enfin, n'utilise pas de chaine de caractères pour représenter une date, car la conversion implicite peut mener à des résultats incorrects sans forcément que tu t'en rendes compte tout de suite.
    Donc ta requête sera plutôt comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT v.user_identifiant,  v.user_nom, v.user_prenom, v.achat_date
     
    FROM (
    SELECT user.user_identifiant,  user.user_nom, user.user_prenom, type.type_code, trunc(achat.achat_date) achat_date
    FROM tab_achat achat
    JOIN tab_user user ON achat.achat_id_usr = user.user_id_user
    JOIN tab_type type ON achat.achat_id_type = type.type_id_type
    WHERE achat.achat_date > to_date('01/01/2020', 'dd/mm/yyyy')
    GROUP BY user.user_identifiant,  user.user_nom, user.user_prenom, type.type_code, trunc(achat.achat_date)
    HAVING COUNT(user.user_identifiant) >= 2 
    ) v
     
    ORDER BY v.user_nom, v.user_prenom

  3. #3
    Membre à l'essai
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juin 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2017
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Bonjour vanagreg,

    Merci pour le conseil sur la date!


    Avec les alias, j'ai rencontré le message "ORA-00923: mot-clé FROM absent à l'emplacement prévu"
    Je me suis dit que j'avais mal fait un truc... J'ai pourtant la même syntaxe que toi.

    Du coup je pense que le trunc() pose souci.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Je ne peux reproduire car je n'ai pas tes tables, mais cette erreur n'est pas liée au trunc en principe. Est-ce que la ligne concernait est indiquée dans l'erreur?
    Sinon si tu exécutes la requête dans la vue imbriquée, cela fonctionne-t-il?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juin 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2017
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Je ne peux reproduire car je n'ai pas tes tables, mais cette erreur n'est pas liée au trunc en principe. Est-ce que la ligne concernait est indiquée dans l'erreur?
    Sinon si tu exécutes la requête dans la vue imbriquée, cela fonctionne-t-il?
    Je n'ai pas de ligne indiquée.
    Après j'utilise l'interface web d'un logiciel pour faire la requête c'est peut-être ça qui pose souci.

    Je vais voir si je peux interroger la base de données autrement.

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    "ORA-00923: mot-clé FROM absent à l'emplacement prévu" signifie que la requête SQL a été mal construite.
    Par exemple au lieu de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT sysdate FROM dual;
    ton logiciel fait
    : il manque le FROM et tu auras ce message ou un autre.
    Pour ce genre de message, si tu n'as pas la main sur comment est construite la requête, je ne vois pas comment tu peux corriger. Mais c'est bizarre, si tu passes par un logiciel, il a été "forcément" testé donc tu ne devrais pas avoir cette erreur.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    évitez aussi les mots réservés (par exemple "user", "type") pour vos propres objects dans vos requêtes.

Discussions similaires

  1. [XL-2007] Ajouter une date format mm/aa dans une cellule a partir d"une textbox
    Par Ltspitfire dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/12/2014, 08h51
  2. Réponses: 0
    Dernier message: 22/05/2014, 17h24
  3. utiliser un Decimal format avec un type double
    Par Mobistar dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 07/03/2008, 13h47
  4. [MySQL] récupérer une date formatée avec MySql
    Par stolx_10 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/06/2007, 10h57
  5. Utilisation de case à cocher avec VB6 dans Datagrid
    Par seyiv dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/05/2007, 15h11

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