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 :

Sélection multiple requête récursive [2012]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    France
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : France
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Par défaut Sélection multiple requête récursive
    Bonjour,

    Je rencontre un blocage dans l'écriture de la requête suivante :

    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
    with tab (code, numpere, numui)
    as (select ui.CODE_UI, ui.CLE_PERe, ui.NUM_UI 
    	from t_ui ui
    		/*join T_UI_INFOS_TECH on */
    	where ui.num_ui = (select ui.num_ui from t_ui ui where ui.code_ui = 'XXXXXXXXXX')
     
    	union all
     
    	select ui.code_ui, ui.cle_pere, ui.num_ui
    	from t_ui ui
    		INNER join tab t
    		on t.numui = ui.CLE_PERE)
     
     
    select  /*tab .code, */
    	sum(iif( lbt.TYPE_LIGNE_BT = 'I', lbt.qte,0 )) as 'total des heures de maintenance',
    	sum(iif( lbt.TYPE_LIGNE_BT = 'P', lbt.COUT_LIGNE_BT ,0)) as 'prix pieces détachées(hors matricule, register item)'
     
    from tab 
    	inner join t_bt bt on bt.CLE_UI = tab .numui
    	inner join T_LIGNE_BT lbt on bt.NUM_BT = lbt.CLE_BT
    	/*inner join T_UI_INFOS_TECH info on info.num_ui= tab .numui*/
     
    /*group by tab .code*/
     
    option (maxrecursion 10)

    Je ne voudrais pas l'exécuter que sur le code : 'XXXXXXXXXX' mais sur les code que me sort la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select ui.code_ui from t_ui ui
    	inner join T_UI_INFOS_TECH info on ui.num_ui = info.NUM_UI
    where info.EST_LIGNE_PROD = 'T'
    Quelqu'un aurait il une piste à me fournir ?

    Par avance je vous remercie.

    Alexandre

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    si j'ai bien compris, il suffit de remplacer la requête d'ancrage par celle que vous exposez, en ajoutant les colonnes manquantes (ce que vous semblez avoir commencé d'ailleurs, si on en crois la jointure commentée) :

    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
     
    with tab (code, numpere, numui)
    as (select ui.CODE_UI, ui.CLE_PERe, ui.NUM_UI 
            from t_ui ui
    	inner join T_UI_INFOS_TECH info on ui.num_ui = info.NUM_UI
            where info.EST_LIGNE_PROD = 'T'
     
    	union all
     
    	select ui.code_ui, ui.cle_pere, ui.num_ui
    	from t_ui ui
    		INNER join tab t
    		on t.numui = ui.CLE_PERE)
     
     
    select  /*tab .code, */
    	sum(iif( lbt.TYPE_LIGNE_BT = 'I', lbt.qte,0 )) as 'total des heures de maintenance',
    	sum(iif( lbt.TYPE_LIGNE_BT = 'P', lbt.COUT_LIGNE_BT ,0)) as 'prix pieces détachées(hors matricule, register item)'
     
    from tab 
    	inner join t_bt bt on bt.CLE_UI = tab .numui
    	inner join T_LIGNE_BT lbt on bt.NUM_BT = lbt.CLE_BT
    	/*inner join T_UI_INFOS_TECH info on info.num_ui= tab .numui*/
     
    /*group by tab .code*/
     
    option (maxrecursion 10)

  3. #3
    Membre confirmé
    Homme Profil pro
    France
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : France
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Par défaut
    Bonjour,

    Tout d'abord merci pour votre retour.

    J'avais commencer à écrire une solution comme celle que vous me proposez :

    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
    with tab (code, numpere, numui)
    as (select ui.CODE_UI, ui.CLE_PERe, ui.NUM_UI 
            from t_ui ui
    		inner join T_UI_INFOS_TECH info on ui.num_ui = info.NUM_UI
            where info.EST_LIGNE_PROD = 'T'
     
    	union all
     
    	select ui.code_ui, ui.cle_pere, ui.num_ui
    	from t_ui ui
    		INNER join tab t
    		on t.numui = ui.CLE_PERE)
     
     
    select  tab .code,
    	sum(iif( lbt.TYPE_LIGNE_BT = 'I', lbt.qte,0 )) as 'total des heures de maintenance',
    	sum(iif( lbt.TYPE_LIGNE_BT = 'P', lbt.COUT_LIGNE_BT ,0)) as 'prix pieces détachées(hors matricule, register item)'
     
    from tab 
    	inner join t_bt bt on bt.CLE_UI = tab .numui
    	inner join T_LIGNE_BT lbt on bt.NUM_BT = lbt.CLE_BT
    	inner join T_UI_INFOS_TECH info on info.num_ui= tab .numui
    where info.EST_LIGNE_PROD = 'T'
    group by tab.code
     
    option (maxrecursion 10)
    Le problème de cette solution c'est que la somme n'est fait que sur la ligne de production donnée... ce que je souhaite c'est de sommer ce qui ce passe sur la ligne de production ET sur tous les équipements qui la composent.

  4. #4
    Membre confirmé
    Homme Profil pro
    France
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : France
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Par défaut
    Bonjour,

    Pour amener plus de précision sur le point évoquer je souhaitais faire une requête de ce type :

    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
    with tree (code, numpere, numui)
    as (select ui.CODE_UI, ui.CLE_PERe, ui.NUM_UI 
    	from t_ui ui
    	where ui.num_ui = (select ui.num_ui from t_ui ui where ui.code_ui = (select code_ui from T_UI ui 
    										inner join T_UI_INFOS_TECH inftec on ui.NUM_UI = inftec.NUM_UI 
    										where EST_LIGNE_PROD = 'T'))
     
    	union all
     
    	select ui.code_ui, ui.cle_pere, ui.num_ui
    	from t_ui ui
    		INNER join tree t
    		on t.numui = ui.CLE_PERE)
     
     
    select  /*XXXXXXX affichage du code de la ligne de production*/
    	sum(iif( lbt.TYPE_LIGNE_BT = 'I', lbt.qte,0 )),
    	sum(iif( lbt.TYPE_LIGNE_BT = 'P', lbt.COUT_LIGNE_BT ,0))
     
    from tree 
    	inner join t_bt bt on bt.CLE_UI = tree.numui
    	inner join T_LIGNE_BT lbt on bt.NUM_BT = lbt.CLE_BT
    	/*inner join T_UI_INFOS_TECH info on info.num_ui= tree.numui*/
     
    /*group by XXXXXXX (par le code de la ligne de production)*/
     
    option (maxrecursion 10)
    Mais comme vous le savez ce n'est pas possible car la sous requête retourne plusieurs valeurs... Auriez vous des pistes ?

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Un petit jeu d'essai et le résultat voulu aideraient a comprendre votre problème.

  6. #6
    Membre confirmé
    Homme Profil pro
    France
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : France
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Par défaut
    Bonjour,

    On va dire que j'ai un arbre de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ARBO
    |--UNITE PROD 1
    |  |--EQUIP 11
    |  |--EQUIP 12
    |--UNITE PROD 2
    |  |--COMMUN UNITE 2
    |  |--LIGNE PROD 2
    |  |  |--EQUIP 21
    |  |  |--EQUIP 22
    |--UNITE PROD 3
    |  |--LIGNE PROD 40
    |  |  |--EQUIP 401
    |  |  |--EQUIP 422
    Toutes les infos relatives à l'arbre sont dans une table (t_ui). A cette table s'associe une autre table qui me donne l'information pour savoir si un équipement (ui) à des spécificités comme si cet équipement est une ligne de production (t_ui_info_tech).

    Sur chaque équipement nous avons la possibilité d'enregistrer des Bon de travaux (BT) qui nous permettent d'enregistrer des information sur des intervention (comme des heures de travail).

    Ce que je souhaite extraire c'est un tableau récapitulatif des heures passées en 1 mois sur une ligne de production. En plus clair, la totalité des heures enregistrées dans les BT liés à une ligne de production + la totalité des heures enregistrées dans les BT des équipements fils d'une ligne de production.

    La requête que j'ai bâtie (Cf messages précédent) me permet d'extraire les informations sur une ligne de production donnée (en rouge dans la fenêtre suivante) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ARBO
    |--UNITE PROD 1
    |  |--EQUIP 11
    |  |--EQUIP 12
    |--UNITE PROD 2
    |  |--COMMUN UNITE 2
    |  |--LIGNE PROD 2
    |  |  |--EQUIP 21
    |  |  |--EQUIP 22
    |--UNITE PROD 3
    |  |--LIGNE PROD 40
    |  |  |--EQUIP 401
    |  |  |--EQUIP 422
    Alors que je souhaiterais savoir ce qui c'est passé dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ARBO
    |--UNITE PROD 1
    |  |--EQUIP 11
    |  |--EQUIP 12
    |--UNITE PROD 2
    |  |--COMMUN UNITE 2
    |  |--LIGNE PROD 2
    |  |  |--EQUIP 21
    |  |  |--EQUIP 22
    |--UNITE PROD 3
    |  |--LIGNE PROD 40
    |  |  |--EQUIP 401
    |  |  |--EQUIP 422
    Tout ça en une seule requête.

    Pour plus d'explication le rendu serait de la forme suivante :
    Nom : Capture1.PNG
Affichages : 226
Taille : 4,6 Ko

    L'idée serait donc de sélectionner le code de chaque ligne de production et de regarder ce qui c'est passé sur celle ci en lui ajoutant ce qui c'est passé sur tous ces fils.

    Je sais pas si je répond à votre demande de précision. Avez vous des suggestions ?

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

Discussions similaires

  1. [MySQL] Select multiple pré-sélectioné selon requête SQL
    Par elodie1234 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 21/07/2008, 14h29
  2. Utiliser une sélection multiple comme critère de requête
    Par Sébastien Le Goyet dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 03/04/2007, 14h40
  3. Réponses: 7
    Dernier message: 16/03/2007, 13h33
  4. Réponses: 24
    Dernier message: 01/12/2005, 16h54
  5. [JList] bloquer la sélection multiple
    Par soad dans le forum Composants
    Réponses: 2
    Dernier message: 05/08/2004, 22h28

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