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 :

Requête - Fusion de résultats


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut Requête - Fusion de résultats
    Hello Forum,

    Le contexte : mes agents peuvent télécharger directement des documents électroniques dans leurs dossiers et/ou dans les dossiers des autres gestionnaires.

    Mon but : avoir une liste mensuelle par agent qui me permet de savoir dans combien de dossiers :
    • au moins un document a été téléchargé par lui-même
    • au moins un document a été téléchargé par un autre
    • au moins un document a été téléchargé pour un autre


    J'exécute cette requête (c'est une adaptation d'un post https://www.developpez.net/forums/d2.../#post11555647 - Encore merci à vanagreg).

    Ma première question (je sais, c'est pas de l'aide habituelle) : est-ce que ce que j'ai réalisé - et qui me donne les bons résultats - est optimal ? En effet, je suis tout nouveau dans le domaine et j'ai certainement plein de choses à apprendre. Un grand merci,

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    -- BY_HIMSELF / BY_OTHER / FOR_OTHER
    with uploaded_docs 
    as (select to_char(ad.process_date,'mm/yyyy') as Month_Select
               , ad.file_number
               , ad.lot_number
               , ad.agent_number as ID_SCANNER
               , ag2.first_name || ' ' || ag2.last_name as SCANNER
                , ag.agent_number AS ID_FILEMANAGER
                , ag.first_name || ' ' || ag.last_name as FILE_MANAGER
                , CASE
                    WHEN ad.agent_number = ag.agent_number THEN 1
                    ELSE 0
                  END AS BY_HIMSELF
                , CASE
                    WHEN ad.agent_number <> ag.agent_number  THEN 1
                    ELSE 0
                 END AS BY_OTHER
                , CASE
                    WHEN ad.agent_number <> ag.agent_number  THEN 1
                    ELSE 0
                 END AS FOR_OTHER
        from archived_documents ad
        inner join file_managements fm on fm.file_number = ad.file_number
        inner join agents ag on ag.agent_id = fm.file_manager_id 
            and to_char(start_date,'yyyymm') < '202012' and end_date is null 
            and fm.filemanagement_type = 'PERMANENT'
        left join agents ag2 on ag2.agent_number = ad.agent_number 
        where to_char(ad.process_date,'yyyymm') = '202005'
            and ad.archived_type='DIRECT'
       ), S_BY_HIMSELF_AND_OTHER as (
    select  Month_Select
          , FILE_MANAGER AS FILE_MANAGER
          , count(distinct case when BY_HIMSELF = 1 then file_number end) AS INJECTED_DOCUMENT_BY_HIMSELF
          , count(distinct case when BY_OTHER = 1 then file_number end) AS INJECTED_DOCUMENT_BY_other
    from uploaded_docs
    group by Month_Select, FILE_MANAGER
    ), S_FOR_OTHER as (
    select  Month_Select 
          , SCANNER AS SCANNER
          , count(distinct case when FOR_OTHER = 1 then file_number end) AS INJECTED_DOCUMENT_FOR_other
    from uploaded_docs
    group by Month_Select, SCANNER
    )
    select 
      nvl(B.Month_Select, FR.Month_Select) as Month_Select
      , nvl(B.FILE_MANAGER, FR.SCANNER) as FILE_MANAGER
      , B.INJECTED_DOCUMENT_BY_HIMSELF
      , B.INJECTED_DOCUMENT_BY_OTHER
      , FR.INJECTED_DOCUMENT_FOR_other
    from 
      S_BY_HIMSELF_AND_OTHER B
      full outer join S_FOR_OTHER FR on B.FILE_MANAGER = FR.SCANNER
    order by 2
    ;
    Ma seconde question : est-il possible de remplacer les données Null en 0 ?

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Les formules BY_OTHER et FOR_OTHER sont identiques, prob. un copy/paste non corrigé

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    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 176
    Par défaut
    Bonjour,

    Si tu n'as pas de problème de performance avec la requête alors inutile de se poser trop de questions. Juste une remarque sur la sélection des colonnes date. Pour qu'un index puisse éventuellement être utilisé, il ne faut pas appliquer de fonction sur les colonnes dates, mais plutôt sur les valeurs. Donc tes conditions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    to_char(start_date,'yyyymm') < '202012'
    to_char(ad.process_date,'yyyymm') = '202005'
    peuvent être réécrites ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    start_date < to_date('20201201', 'yyyymmdd')
    ad.process_date >= to_date('20200501', 'yyyymmdd') and ad.process_date < to_date('20200601', 'yyyymmdd')

  4. #4
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    JeitEmgie
    Effectivement,il y a une redondance. Mais elle est utile car elle permet de voir ce qui est fait par un autre. Je vais donc améliorer le sql en gardant une occurrence OTHER que j'utiliserai en fonction du FILE_MANAGER ou du SCANNER. Cela permet donc de voir ce qui a été fait pour un autre ou ce qu'un autre a fait pour l'agent.

    J'arrive à ceci :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    -- BY_HIMSELF / BY_OTHER / FOR_OTHER
    with uploaded_docs 
    as (select to_char(ad.process_date,'mm/yyyy') as Month_Select
               , ad.file_number
               , ad.lot_number
               , ad.agent_number as ID_SCANNER
               , ag2.first_name || ' ' || ag2.last_name as SCANNER
                , ag.agent_number AS ID_FILEMANAGER
                , ag.first_name || ' ' || ag.last_name as FILE_MANAGER
                , CASE
                    WHEN ad.agent_number = ag.agent_number THEN 1
                    ELSE 0
                  END AS BY_HIMSELF
                , CASE
                    WHEN ad.agent_number <> ag.agent_number  THEN 1
                    ELSE 0
                 END AS OTHER
        from archived_documents ad
        inner join file_managements fm on fm.file_number = ad.file_number
        inner join agents ag on ag.agent_id = fm.file_manager_id 
            and to_char(start_date,'yyyymm') < '202012' and end_date is null 
            and fm.filemanagement_type = 'PERMANENT'
        left join agents ag2 on ag2.agent_number = ad.agent_number 
        where to_char(ad.process_date,'yyyymm') = '202001'
            and ad.archived_type='DIRECT'
       ), S_BY_HIMSELF_AND_OTHER as (
    select  Month_Select
          , FILE_MANAGER AS FILE_MANAGER
          , count(distinct case when BY_HIMSELF = 1 then file_number end) AS INJECTED_DOCUMENT_BY_HIMSELF
          , count(distinct case when OTHER = 1 then file_number end) AS INJECTED_DOCUMENT_BY_other
    from uploaded_docs
    group by Month_Select, FILE_MANAGER
    ), S_FOR_OTHER as (
    select  Month_Select 
          , SCANNER AS SCANNER
          , count(distinct case when OTHER = 1 then file_number end) AS INJECTED_DOCUMENT_FOR_other
    from uploaded_docs
    group by Month_Select, SCANNER
    )
    select 
      nvl(B.Month_Select, FR.Month_Select) as Month_Select
      , nvl(B.FILE_MANAGER, FR.SCANNER) as FILE_MANAGER
      , B.INJECTED_DOCUMENT_BY_HIMSELF
      , B.INJECTED_DOCUMENT_BY_OTHER
      , FR.INJECTED_DOCUMENT_FOR_other
    from 
      S_BY_HIMSELF_AND_OTHER B
      full outer join S_FOR_OTHER FR on B.FILE_MANAGER = FR.SCANNER
    order by 2
    ;

  5. #5
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    vanagreg
    Merci pour le retour.
    La façon que j'utilisais permettait de ne changer qu'une date à un seul endroit. C'était une astuce ...

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    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 176
    Par défaut
    Dans la clause SELECT pourquoi pas, mais dans les clauses ON ou WHERE il faut éviter, et puisque ta question était de savoir si la requête était optimale.

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

Discussions similaires

  1. Fusion de résultats de requêtes
    Par epeedelorage dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/04/2013, 15h15
  2. [AC-2007] Fusion de résultat de requêtes
    Par aurekium dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 06/06/2011, 15h04
  3. Requête MySQL sans résultat...
    Par x86-master dans le forum Installation
    Réponses: 13
    Dernier message: 10/12/2005, 14h19
  4. Tester si une requête renvoie un résultat
    Par dl_jarod dans le forum ASP
    Réponses: 4
    Dernier message: 13/10/2005, 15h48
  5. Savoir si une requête retourne un résultat ou pas
    Par zut94 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/09/2005, 15h48

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