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ête imbriquée / fusionnée


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Requête imbriquée / fusionnée
    Bonjour à tous,

    J'ai une table sur laquelle j'ai différentes lignes pour un même ID. J'arrive à sélectionner les deux lignes et champs qui m'intéresse pour chaque ID.
    Mais j'aimerai faire la différence avec mes dates de fin et de début par exemple... Je ne parviens pas à "select" les données de mes lignes pour faire cela.
    Désolé si je ne suis pas clair, le screenshot suivant devrait éclaircir ma demande :

    Nom : 1.png
Affichages : 94
Taille : 49,6 Ko

    Merci d'avance,
    Daman

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 194
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 194
    Points : 8 409
    Points
    8 409
    Billets dans le blog
    17
    Par défaut
    Cela va dépendre de la nature du résultat souhaite.
    1. Si 1 ligne par TR_TASK_ID => Tu peux faire un GROUP BY et un TIMESTAMPDIFF() sur le MIN(MOD_DATE) et le MAX(MOD_DATE)
    2. Si 2 lignes par TR_TASK_ID => Tu peux utiliser LEAD(MOD_DATE) ou LAG(MOD_DATE) sur la partition du TR_TASK_ID pour récupérer les valeurs d'autres lignes et effectuer ton TIMESTAMPDIFF()

    Ex. pour le 1er cas :

    SELECT ALL TR_TASK_ID, TIMESTAMPDIFF(SECOND, MIN(MOD_DATE), MAX(MOD_DATE)) AS DURATION_SECONDS
    FROM ta_table
    GROUP BY TR_TASK_ID
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 776
    Points : 1 488
    Points
    1 488
    Par défaut
    Est-ce que l'objectif est d'avoir la date de création et de suppression pour un même id ?

    En supposant que les évènement de création et suppression sont uniques pour un même objet :
    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
    with
    creat as (select tr_task_id,  mod_date
    		from mfc_cor_transport_history
    		where to_mod_type ='CREATE'
    		  AND to_process_status='ACTIVE'
    		  AND mod_user ='ReallocationDemon')
    ,del as (select tr_task_id,  mod_date
    		from mfc_cor_transport_history
    		where to_mod_type ='DELETE'
    		  AND to_process_status='FINISHED'
    		  AND mod_user ='ReallocationDemon'
    		  --AND tr_task_id in (select tr_task_id from creat)
    		  )
    select c.tr_task_id
    	, c.mod_date as create_date
    	, d.mod_date as delete_date 
    from creat c 
    	inner join del d on d.tr_task_id=c.tr_task_id
    ;
    Le savoir est une nourriture qui exige des efforts.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    J'ai finalement pu créer une requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select deb.tr_task_id, deb.mod_date as date_debut, fin.tr_task_id, fin.mod_date as date_fin, fin.mod_date - deb.mod_date as ecart
    from mfc_cor_transport_history fin, mfc_cor_transport_history deb
    where fin.tr_task_id = deb.tr_task_id(+)
    and fin.to_mod_type = 'DELETE' and fin.to_process_status = 'FINISHED' and deb.to_mod_type = 'CREATE' and deb.to_process_status = 'ACTIVE' and deb.mod_user = 'ReallocationDemon'
    order by ecart;

    Merci de votre aide,
    Damien

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 150
    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 150
    Points : 1 935
    Points
    1 935
    Par défaut
    Bonjour,

    En fait tu veux pivoter tes données. Tu peux utiliser l'opérateur PIVOT, ce qui éviteras d'interroger 2 fois la table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select tr_task_id, deb_mod_date as date_debut, fin_mod_date as date_fin, fin_mod_date - deb_mod_date as ecart
    from mfc_cor_transport_history
    pivot (min(mod_date) as mod_date, min(to_process_status) as status for to_mod_type in ('CREATE' as deb, 'DELETE' as fin))
    order by tr_task_id;

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 291
    Points : 39 558
    Points
    39 558
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Daman42 Voir le message
    J'ai finalement pu créer une requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select deb.tr_task_id, deb.mod_date as date_debut, fin.tr_task_id, fin.mod_date as date_fin, fin.mod_date - deb.mod_date as ecart
    from mfc_cor_transport_history fin, mfc_cor_transport_history deb
    where fin.tr_task_id = deb.tr_task_id(+)
    and fin.to_mod_type = 'DELETE' and fin.to_process_status = 'FINISHED' and deb.to_mod_type = 'CREATE' and deb.to_process_status = 'ACTIVE' and deb.mod_user = 'ReallocationDemon'
    order by ecart;

    Merci de votre aide,
    Damien
    Cette syntaxe date des années 80 et ne fonctionnera pas sur tous les SGBD , depuis la norme SQL:1992, les jointures se codent avec l'opérateur JOIN

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. "boutons" imbriqués !!
    Par biloubil dans le forum Flash
    Réponses: 9
    Dernier message: 04/12/2003, 14h03
  3. SYBASE SELECT imbriqué clause FROM
    Par Nicolas Martel dans le forum Sybase
    Réponses: 2
    Dernier message: 19/11/2003, 15h28
  4. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51
  5. [] [Excel] Fusionner des cellules
    Par SamyD dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/12/2002, 18h37

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