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 :

Besoin d'aide sur requête


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Besoin d'aide sur requête
    Bonjour,

    J'ai un besoin d'aide pour rédiger une requête SQL.
    Etan débutant, et faisant une analyse sur la pertinence d'une requête déjà faite.
    J'ai procédé par découper la requête initial afin de pouvoir étudier la pertinence des données remonté.
    En faisant ça, j'ai pu me rendre compte que la requête n'était pas limité en thermes de période.

    Peut être que vous allez me conseiller de m'orienter vers une vision différente de celle que j'ai choisi et je ne suis pas contre, je possède juste peut d'expérience en SQL.

    Je vais vous établir tout mon travail depuis la requête initial.

    La requête initial qui à pour objectif de remonter les données au format suivante :
    Opérateur | ETAPE(statu d'un carton ou article) | Nbr (quantité de carton ou d'article)
    INT12345 | 3 - Emballé | 6 (pour 6 cartons par exp)

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    SELECT *
    FROM
    --articles
    (select  ptt.user_id as "OPERATEUR", '1 - Pièces Recues' as "ETAPE",
    sum(case when ptt2.tran_nbr is not null then ptt2.nbr_units else ptt.nbr_units end) as "Nbr" 
    from prod_trkg_tran ptt
    left join (select * from prod_trkg_tran ptt2 where tran_type =600 and  trunc(create_date_time) = trunc(sysdate)) ptt2 on 
    ptt2.cntr_nbr = ptt.cntr_nbr and rownum = 1
    where ptt.tran_type =100 and  trunc(ptt.create_date_time) = trunc(sysdate)
    group by ptt.user_id
    --/article
    union
    --Carton
    SELECT user_id as "OPERATEUR",'3 - oLPN Emballés' as "ETAPE", count(cntr_nbr) as "Nbr" from prod_trkg_tran where old_stat_code <20 and new_stat_code = 20 and trunc(create_date_time) = trunc(sysdate) group by user_id
    --/Carton
    union
    --Articles
    select last_updated_source as "OPERATEUR", '4 - Pièces Emballées' as "ETAPE", sum(on_hand_qty) as "Nbr" from  wm_inventory 
    where tc_lpn_id in (
    SELECT distinct cntr_nbr from prod_trkg_tran where old_stat_code <20 and new_stat_code = 20 
    and trunc(create_date_time) = trunc(sysdate))
    group by last_updated_source
    --/Article
    union
    --Carton
    SELECT user_id as "OPERATEUR", '5 - oLPN Ancrés' as "ETAPE", count(cntr_nbr) as "Nbr" from prod_trkg_tran where old_stat_code =20 and new_stat_code = 20 
    and to_locn in (select locn_id from locn_hdr where dsp_locn like 'CONS%')
    and trunc(create_date_time) = trunc(sysdate)
    group by user_id
    union
    SELECT user_id as "OPERATEUR", '6 - oLPN Chargés' as "ETAPE", count(cntr_nbr) as "Nbr" from prod_trkg_tran where old_stat_code =20 and new_stat_code = 50 
    and trunc(create_date_time) = trunc(sysdate)
    group by user_id)
    --/carton
    Donc cette requête initial est trop complexe pour moi, du coup j'ai procédé au découpage afin de travailler par étapes.
    Dans ce code, vous trouverez des balises "--Article et --/Article" pour vous permettre de vous repérer.

    Voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT user_id as "OPERATEUR",'3 - oLPN Emballés' as "ETAPE", cntr_nbr as "OLPN"
    FROM prod_trkg_tran
    WHERE old_stat_code <20 and new_stat_code = 20 and trunc(create_date_time) = trunc(sysdate)AND user_id ='INT52'
    AND CREATE_DATE_TIME >= '25/08/20 07:00:00,000000000' AND CREATE_DATE_TIME >= '25/08/20 14:00:00,000000000';
    Maintenant, je vous explique mon besoin. Il est que sur le bout de requête que j'ai se base sur une date et un user défini manuellement.
    Je souhaiterai sur ce code
    1 : qu'il ce base sur la date du jour.
    2 : Comme sur la requête initiale, qu'elle récupère les données pour tous les utilisateurs présent dans la colonne "user_id".

    Je suis dans mon jus, si je ne suis pas claire. N'hésitez pas à me poser vos questions.

    MErci par avance.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Finalement, j'ai trouvé la soluce à mon problème
    Bonjour,

    La ligne suivante, en faite permet de faire à la date du jour. Il fallait la comprndre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trunc(CREATED_DTTM) = trunc(sysdate)
    Je vous joins ce que j'ai pondu et qui m'a permis de valider les données remonté par la première requête d'une manière sensiblement différente.

    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
     
    SELECT user_id as "OPERATEUR",'3 - oLPN Emballés' as "ETAPE", count(cntr_nbr) as "OLPN"
    FROM prod_trkg_tran
    WHERE old_stat_code <20 and new_stat_code = 20 and trunc(create_date_time) = trunc(sysdate)
    AND trunc(create_date_time) = trunc(sysdate) AND old_stat_code <20 and new_stat_code = 20 group by user_id;
    ------------------------------------------------------------------------------------------------------------------------------------
    SELECT user_id as "OPERATEUR",'3 - oLPN Emballés' as "ETAPE", count(cntr_nbr) as "OLPN"
    FROM prod_trkg_tran
    WHERE old_stat_code <20 and new_stat_code = 20 and trunc(create_date_time) = trunc(sysdate)
    AND trunc(create_date_time) = trunc(sysdate) AND old_stat_code <20 and new_stat_code = 20 group by user_id, cntr_nbr;
    ------------------------------------------------------------------------------------------------------------------------------------
    SELECT user_id as "OPERATEUR",'3 - oLPN Emballés' as "ETAPE", cntr_nbr as "OLPN", CREATE_DATE_TIME
    FROM prod_trkg_tran
    WHERE old_stat_code <20 and new_stat_code = 20 
    AND user_id = 'INT15'
    AND trunc(create_date_time) = trunc(sysdate) 
    AND old_stat_code <20 and new_stat_code = 20 group by user_id, cntr_nbr, CREATE_DATE_TIME;
    Cdt,

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il vaut mieux utiliser cette expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATED_DTTM >= trunc(sysdate) AND CREATED_DTTM < trunc(sysdate) + 1
    Si vous définissez des index ou partition sur CREATED_DTTM, ils seront directement utilisés.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il vaut mieux utiliser cette expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATED_DTTM >= trunc(sysdate) AND CREATED_DTTM < trunc(sysdate) + 1
    Si vous définissez des index ou partition sur CREATED_DTTM, ils seront directement utilisés.
    Bonjour Walsar,

    Merci pour ta réponse.
    J'ai peur sur ma capacité à comprendre la subtilité dans ta remarque.
    J'ai regardé sur le net et je ne trouve pas de guide d'utilisation explicatif de la fonction <Trunc(sysdate)> et du coup je ne sais pas si c'est une spécificité de ma base de donnée ou générique à SQL ou ORACLE SQL.
    Pourrais-tu mettre un exemple stp.
    Merci par avance.

    Bien à toi.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Trunc est une fonction propre à Oracle, qui tronque une date à l'élément demandé (par défaut, le jour) :
    https://docs.oracle.com/cd/B19306_01...nctions201.htm

    Mais on la trouve dans tous les SGBD avec parfois d'autres noms (date_trunc sous postgresql par exemple).

    Sysdate est une pseudocolonne propre à Oracle retournant la date et l'heure de la base de données.

    Ma remarque était de ne pas appliquer de fonction à vos données, moins de calcul à faire pour la base.

    Et si vous avez un index sur votre table sur cette colonne, ça ira très vite.
    La subtilité c'est que vous pouvez aussi avoir un index sur trunc(created_dttm) et là ma remarque n'a plus de sens

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

Discussions similaires

  1. [AC-2013] Besoin d'aide sur Requête jointures externes ambigües
    Par Paninak dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 01/07/2016, 17h31
  2. Besoin d'aide sur requête Sql
    Par Sekigawa dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 31/12/2009, 15h14
  3. Besoin d'aide sur requête update
    Par fardon57 dans le forum SQL
    Réponses: 0
    Dernier message: 17/12/2008, 12h53
  4. Besoin d'aide sur une requête (JOIN + COUNT ?)
    Par PanzerKunst dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2005, 10h29
  5. Besoin d'aide sur requête croisée
    Par keawee dans le forum Access
    Réponses: 7
    Dernier message: 18/11/2004, 09h46

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