SOS aux forts en sql

Résolu
splims Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   -  
splims Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

10 réponses

Eldar57 Messages postés 46 Date d'inscription   Statut Membre Dernière intervention   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
Christounet Messages postés 1264 Date d'inscription   Statut Membre Dernière intervention   1 392
 
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
splims Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   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
Christounet Messages postés 1264 Date d'inscription   Statut Membre Dernière intervention   1 392
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
splims Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   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
splims Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   10
 
J'utilise oracle
0
Christounet Messages postés 1264 Date d'inscription   Statut Membre Dernière intervention   1 392
 
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
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   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
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   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
splims Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   10
 
Merci
0