SOS aux forts en sql

Résolu
splims Messages postés 29 Statut Membre -  
splims Messages postés 29 Statut Membre -
Bonjour,
Je retourne encore une fois vers vous pour un problème que j'ai déja posé ici et à qui j'ai pas trouvé de réponse
J'éexplique mon pb

Mon problème est le suivant:

J'ai affaire à des lots et des sous lots qu'on peut distinguer par la catégorie
je m'explique: si la catégorie est de "PSOR" il s'agit d'un lot et si la catégory est de "PSOR" il s'agit d'un sous lot
Chaque sous lot à un lot parent unique, ils ont en commun les 1èrs 5 caractère du numéro de lot
ca veut dire.. par exemple si on a un lot dont le numéro de lot (num_lot) est L1234, ses sous lots sont de la forme L1234A, L1234B, L1234C..etc
Donc on peut remonter aux lot parents à partir du sous lots fils
Ma table contient parmi d'autre les colonnes suivantes
ma_colonne1, ma_colonne2, num_lot, category...etc
je veux récupérer les valeurs de ma_colonne1 et ma_colonne2
suivant la catégory
Si category="PSOF"====> j'affiche directement ma_colonne1, ma_colonne2
Si category="PSOR"====> il s'agit d'un sous lot, donc il faut que je remonte au lot parent pour afficher ma_colonne1, ma_colonne2

J'espère que je suis clair

Ma question est: est ce qu'on peut faire une seule reqûete pour afficher ma_colonne1, ma_colonne2

Et merci par avance
Configuration: Windows XP
Internet Explorer 6.0

10 réponses

  1. Eldar57 Messages postés 50 Date d'inscription   Statut Membre 7
     
    quand c'est un sous lot, as tu quelque chose dans les colonnes 1 et 2 ?

    - si oui, pourquoi tu n'affiches pas directements les infos alors?

    - si non, pourquoi n'y mets tu pas les informations du lot ?
    0
  2. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    Bonjour splims,

    Le code suivant devrait faire ce que tu veux
    SELECT num_lot , ma_colonne1 , ma_colonne2
    FROM nomdetatable
    WHERE category = 'PSOF'
    UNION
    SELECT t1.num_lot ,
    (SELECT ma_colonne1 , ma_colonne2
    FROM nomdetatable t2
    WHERE t2.num_lot = left(t1.num_lot,5))
    FROM nomdetatable t1
    WHERE t1.category = 'PSOR'

    Le premier SELECT sélectionne tous les enregistrements de la catégorie PSOF, le deuxième SELECT sélectionne les deux colonnes du lot parent pour les enregistrements de la catégorie PSOR.

    A plus
    0
  3. splims Messages postés 29 Statut Membre 10
     
    Merci pour la réponse mais la requête ne fait pas ce que je veux

    En fait je travail sur le reporting, génération des rapports avec jasper

    Je selectionne un batch (lot) et selon la catégorie de ce batch j'affiche sur le rapport les deux données ma_colonne1 et ma_colonne2
    donc je sais d'avance la catégorie de mon batch, le pb c'est comment traiter les if dans une requête sql, y'a t'il un autre moyen pour résoudre ça?

    Merci
    0
  4. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    Bonjour,

    Quelle base de données utilises-tu ? Access , SQL Server , ....
    En fonction de ta réponse je pourrai peut-être te proposer une solution.
    A plus
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. splims Messages postés 29 Statut Membre 10
     
    Peu importe que les colonnes contiennent ou pas des données s'il s'agit d'un sous lot, ce qui m'interesse c'est les informations relatives au lot père.

    le lot il fo y remonter aprés si le lot séléctionné est un fils

    donc y'aura une instruction du genre

    quant je clique pour lancer mon rapport il ya ca

    a partir du numéro du lo je cherche sa catégory

    if( category='PSOR' then
    chercher le lot parent correspendant
    et chercher les colonnes 1 et 2
    }
    else
    afficher directement les colonnes 1 et 2

    le pb c'est que j'arrive pas à faire combiner tout ca en une seule requête
    0
  7. splims Messages postés 29 Statut Membre 10
     
    J'utilise oracle
    0
  8. Christounet Messages postés 1272 Date d'inscription   Statut Membre Dernière intervention   1 393
     
    Bonjour splims,

    Dans Oracle ( à partir de la version 9i) il existe l'instruction CASE, exemple de code
    SELECT t1.num_lot, 
    CASE t1.category
    WHEN 'PSOF' THEN t1.ma_colonne1
    WHEN 'PSOR' THEN (select t2.ma_colonne1 from nomtable t2 where t2.num_lot = substr(t1.num_lot,1,5))
    END ,
    CASE t1.category
    WHEN 'PSOF' THEN t1.ma_colonne2
    WHEN 'PSOR' THEN (select t2.ma_colonne2 from nomtable t2 where t2.num_lot = substr(t1.num_lot,1,5))
    END
    FROM nomtable t1
    WHERE t1.num_lot = numérodulotchoisi

    J'ai pas testé n'ayant pas Oracle sur mon PC.
    A plus
    0
  9. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    J'ai fait un truc en SQL/DB2 qui semble correspondre au problème si je l'ai convenablement compris. En tout cas ça peut aussi servir à préciser le problème :

    DROP   TABLE 			TESTFOR 				    ;
     CREATE TABLE 			TESTFOR 				    ( 
    			num_lot        	CHAR    (7)     NOT NULL	    ,
                     	column_1     	CHAR    (30)    NOT NULL	    ,
    			column_2     	CHAR    (30)    NOT NULL	    ,
    			categorie       CHAR    (4)     NOT NULL	    ,
    			PRIMARY KEY     (num_lot) 			   ) ;
    
        INSERT     	INTO 		TESTFOR  
    	VALUES ('L1234',  'Column 1 lot PSOF L1234', 'Column 2 lot PSOF L1234', 'PSOF')      ,
    	       ('L1234A', 'Column 1 S/lot PSOR L1234A', 'Column 2 S/lot PSOR L1234A', 'PSOR'),
    
    	       ('L2234',  'Column 1 lot PSOF L2234', 'Column 2 lot PSOF L2234', 'PSOF')	     ,
    	       ('L2234A', 'Column 1 S/lot PSOR L2234A', 'Column 2 S/lot PSOR L2234A', 'PSOR'),
    	       ('L2234B', 'Column 1 S/lot PSOR L2234B', 'Column 2 S/lot PSOR L2234B', 'PSOR'),
    	       ('L2234C', 'Column 1 S/lot PSOR L2234C', 'Column 2 S/lot PSOR L2234C', 'PSOR'),
    
    	       ('L3334',  'Column 1 lot PSOF L3334', 'Column 2 lot PSOF L3334', 'PSOF')      ,         
    	       ('L3334A', 'Column 1 S/lot PSOR L3334A', 'Column 2 S/lot PSOR L3334A', 'PSOR');
    
      SELECT  *         FROM        TESTFOR 				    ;
    
    -- Résultat de la requête :
    --NUM_LOT COLUMN_1                       COLUMN_2                       CATEGORIE
    --------- ------------------------------ ------------------------------ ---------
    -- L1234   Column 1 lot PSOF L1234        Column 2 lot PSOF L1234        PSOF     
    -- L1234A  Column 1 S/lot PSOR L1234A     Column 2 S/lot PSOR L1234A     PSOR     
    -- L2234   Column 1 lot PSOF L2234        Column 2 lot PSOF L2234        PSOF     
    -- L2234A  Column 1 S/lot PSOR L2234A     Column 2 S/lot PSOR L2234A     PSOR     
    -- L2234B  Column 1 S/lot PSOR L2234B     Column 2 S/lot PSOR L2234B     PSOR     
    -- L2234C  Column 1 S/lot PSOR L2234C     Column 2 S/lot PSOR L2234C     PSOR     
    -- L3334   Column 1 lot PSOF L3334        Column 2 lot PSOF L3334        PSOF     
    -- L3334A  Column 1 S/lot PSOR L3334A     Column 2 S/lot PSOR L3334A     PSOR     
    
    -------------------------------------------------------------------------------------------------------------------
    
      SELECT  B.num_lot, A.column_1,  A.column_2,  B.categorie    
              FROM        TESTFOR A, TESTFOR B
                  WHERE   SUBSTR (B.num_lot, 1, 5)  =  A.num_lot                ;
    
    -------------------------------------------------------------------------------------------------------------------
    
    -- Résultat de la requête :
    -- NUM_LOT COLUMN_1                       COLUMN_2                       CATEGORIE
    -- ------- ------------------------------ ------------------------------ ---------
    -- L1234   Column 1 lot PSOF L1234        Column 2 lot PSOF L1234        PSOF     
    -- L1234A  Column 1 lot PSOF L1234        Column 2 lot PSOF L1234        PSOR     
    -- L2234   Column 1 lot PSOF L2234        Column 2 lot PSOF L2234        PSOF     
    -- L2234A  Column 1 lot PSOF L2234        Column 2 lot PSOF L2234        PSOR     
    -- L2234B  Column 1 lot PSOF L2234        Column 2 lot PSOF L2234        PSOR     
    -- L2234C  Column 1 lot PSOF L2234        Column 2 lot PSOF L2234        PSOR     
    -- L3334   Column 1 lot PSOF L3334        Column 2 lot PSOF L3334        PSOF     
    -- L3334A  Column 1 lot PSOF L3334        Column 2 lot PSOF L3334        PSOR
    
      COMMIT; 
    --
    Cordialement.

    Cchristian.
    0
  10. cchristian Messages postés 928 Statut Membre 131
     
    Amélioration apportée à la requête :

      SELECT  B.num_lot, A.column_1,  A.column_2,  B.categorie    
              FROM        TESTFOR A, TESTFOR B 
                  WHERE   SUBSTR (B.num_lot, 1, LENGTH (A.num_lot))  =  A.num_lot
                      AND A.categorie                                = 'PSOF'     ;

    0
  11. splims Messages postés 29 Statut Membre 10
     
    Merci
    0