[Résolu]SQL Données sur une seule ligne au lieu de 2

RPG (3 et 4, free), CL, SQL, etc...
Répondre
BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

[Résolu]SQL Données sur une seule ligne au lieu de 2

Message par BrigitteG »

N'étant pas experte en sql, je viens vous demander votre aide.

A partir d'un fichier A je dois rechercher dans un autre fichier B la ou les valeurs correspondantes (maxi 2).

Code : Tout sélectionner

Fichier A	zone1, zone2, zone3
		A	1	x1
		A	2	x2
		A	3	x3

Code : Tout sélectionner

Fichier B	zone1, zone2, zone4, zone5
		A	1	x	1
		A	1	y	2
		A	2	x	5
		A	3	y	3

Code : Tout sélectionner

Select zone1, zone2, zone3, zone5
From fichier A
Inner join fichier b on (a.zone1 = b.zone1 and a.zone2 = b.zone2)

Code : Tout sélectionner

Zone1	Zone2	zone3	Zone5
A	1	x1	1
A	1	x1	2
A	2	x2	5
A	3	x3	3

But sortir les infos sur une seule ligne quand le fichier B a deux lignes pour la même valeur zone1 & zone2

J'ai essayé

Code : Tout sélectionner

Select zone1, zone2, zone3, zone5, zone5bis
From fichier A
Inner join fichier b on (a.zone1 = b.zone1 and a.zone2 = b.zone2 and b.zone4 = 'x')
Inner join fichier b1 on (a.zone1 = b1.zone1 and a.zone2 = b1.zone2 and b1.zone4 = 'y')
J'ai regardé avec union, avec with mais je n'arrive jamais à ce résultat

Code : Tout sélectionner

Zone1	Zone2	zone3	Zone5	Zone5bis
A	1	x1	1	2
A	2	x2	5	
A	3	x3		3

Comment puis-je faire pour arriver à ce résultat.

Je vous remercie d'avance pour votre aide.

Je vous souhaite de bonnes fêtes de fin d'année.
Modifié en dernier par BrigitteG le lun. 20 déc. 2021, 15:14:20, modifié 1 fois.

nbonnet
Messages : 198
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: SQL Données sur une seule ligne au lieu de 2

Message par nbonnet »

Bonjour,

je ne suis pas sûr de bien comprendre le résultat attendu, pouvez vous mettre un exemple ?
Nathanaël

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Re: SQL Données sur une seule ligne au lieu de 2

Message par BrigitteG »

résultat obtenu

Code : Tout sélectionner

Pays	Numéro		Date		PRGP01	PRGP02	PRGP03	PRGP04	PRGP05	Non affiché	
FR	7944131454	05/11/2021	4	2	1	2	1		EM	
FR	7944131458	05/11/2021	2	1	1	1			UM	
FR	7944131478	05/11/2021	4	2	1	2	1		EM	
FR	7944131478	05/11/2021	2	1	1	1			UM	
	
résultat voulu

Code : Tout sélectionner

Pays	Numéro		Date	PRGP01	PRGP02	PRGP03	PRGP04	PRGP05	PRGP01	PRGP02	PRGP03	PRGP04	PRGP05
FR	7944131454	05/11/2021	4	2	1	2	1					
FR	7944131458	05/11/2021					2	1	1	1	
FR	7944131478	05/11/2021	4	2	1	2	1	2	1	1	1	
Une zone non retournée indique si type = UM ou type = EM. On me demande les valeurs des types EM et UM sur la même ligne et non deux.

nbonnet
Messages : 198
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: SQL Données sur une seule ligne au lieu de 2

Message par nbonnet »

J'ai essayé de reproduire, si j'ai bien compris :

Code : Tout sélectionner

create table  visite (
codepays    char(2) , 
animal      char(10),
datevisite  date ,
prgp01      char(1),
prgp02      char(1),
prgp03      char(1),
prgp04      char(1),
prgp05      char(1) ) ;

insert into visite values('FR', '7944131454', current date, '4', '2', '1', '2', '1'), 
                         ('FR', '7944131454', current date, '2', '1', '1', '1', ''),
                         ('FR', '7944131458', current date, '1', '2', '1', '2', '2'),
                         ('FR', '7944131458', current date, '2', '1', '1', '1', ''), 
                         ('FR', '7944131478', current date, '4', '2', '1', '2', '1'),
                         ('FR', '7944131478', current date, '2', '1', '1', '1', '');  
                         
select * from visite ;
select v.*, rrn(v) from visite v;

select v1.*, v2.PRGP01, v2.PRGP02, v2.PRGP03, v2.PRGP04, v2.PRGP05
from visite v1
join visite v2 on v1.codepays = v2.codepays and v1.animal = v2.animal and v1.datevisite = v2.datevisite and rrn(v1) < rrn(v2) ;

J'ai ajouté le rrn pour ne conserver qu'une seule jointure, ce n'est pas forcément la meilleure solution.
Nathanaël

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Re: SQL Données sur une seule ligne au lieu de 2

Message par BrigitteG »

merci pour votre aide.

le premier fichier comporte pays, animal, date, et d'autres infos ... mais pas de PRGPxx,
Dans ce fichier il a qu'une seule ligne pour pays + animal + date

le second fichier comporte pays, animal, date, type, prgp01, prgp02, prgp03, prgp04, prgp05
il peut avoir une ou deux lignes pour pays + animal + date avec type soit à UM soit à EM

A partir du premier fichier, je voudrais afficher qu'une ligne qui contient les données du premier fichier et du second fichier.
C'est à dire que les données du second fichier si j'ai deux lignes je veux qu'il s'affiche que sur une ligne.


pays, animal, date,prgp01, prgp02, prgp03, prgp04, prgp05 + prgp01, prgp02, prgp03, prgp04, prgp05

vazymimil
Messages : 32
Enregistré le : ven. 28 sept. 2018, 17:14:46

Re: SQL Données sur une seule ligne au lieu de 2

Message par vazymimil »

Bonjour,

ça doit donner quelque chose du genre

Code : Tout sélectionner

SELECT
  a.pays, a.numero, a.date, b1.prgp01 PRGP01_1, b2.prgp01 PRGP01_2, ...
FROM a
  INNER JOIN b b1 ON (b1.pays, b1.numero, b1.date) = (a.pays, a.numero, a.date)
  LEFT JOIN b b2 ON (b2.pays, b2.numero, b1.date) = (a.pays, a.numero, a.date) AND b2.type IS DISTINCT FROM b1.type
WHERE b2.type IS NULL
      OR b2.type > b1.type
Nicolas

nbonnet
Messages : 198
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: SQL Données sur une seule ligne au lieu de 2

Message par nbonnet »

Alors on serait plus sur quelque chose comme ça :

Code : Tout sélectionner

create table animal (
codepays    char(2) , 
animal      char(10),
dateanimal  date,
infos       char(10) ) ;

create table visite (
codepays    char(2) , 
animal      char(10),
datevisite  date ,
type        char(2),
prgp01      char(1),
prgp02      char(1),
prgp03      char(1),
prgp04      char(1),
prgp05      char(1) ) ;

insert into animal values('FR', '7944131454', current date, 'infos'), 
                         ('FR', '7944131458', current date, 'infos'),
                         ('FR', '7944131478', current date, 'infos'),
                         ('FR', '0000000001', current date, 'infos') ;

insert into visite values('FR', '7944131454', current date, 'UM', '4', '2', '1', '2', '1'), 
                         ('FR', '7944131454', current date, 'EM', '2', '1', '1', '1', ''),
                         ('FR', '7944131458', current date, 'UM', '1', '2', '1', '2', '2'),
                         ('FR', '7944131458', current date, 'EM', '2', '1', '1', '1', ''), 
                         ('FR', '7944131478', current date, 'UM', '4', '2', '1', '2', '1'),
                         ('FR', '7944131478', current date, 'EM', '2', '1', '1', '1', ''),
                         ('FR', '0000000001', current date, 'UM', '3', '3', '3', '3', '');  
                         
select * from visite ;
select * from animal ;


select a.*, v1.*, v2.PRGP01, v2.PRGP02, v2.PRGP03, v2.PRGP04, v2.PRGP05 
from animal a
join visite v1 on (a.codepays, a.animal, a.dateanimal, 'UM') = (v1.codepays, v1.animal, v1.datevisite, v1.type) 
left join visite v2 on (a.codepays, a.animal, a.dateanimal, 'EM') = (v2.codepays, v2.animal, v2.datevisite, v2.type);
Je suis parti du principe que l'enregistrement UM existe tout le temps, et que le EM est optionnel.

Cela produit :

Code : Tout sélectionner

FR	7944131454	2021-12-20	infos     	FR	7944131454	2021-12-20	UM	4	2	1	2	1	2	1	1	1	 
FR	7944131458	2021-12-20	infos     	FR	7944131458	2021-12-20	UM	1	2	1	2	2	2	1	1	1	 
FR	7944131478	2021-12-20	infos     	FR	7944131478	2021-12-20	UM	4	2	1	2	1	2	1	1	1	 
FR	0000000001	2021-12-20	infos     	FR	0000000001	2021-12-20	UM	3	3	3	3	 					
Nathanaël

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Re: SQL Données sur une seule ligne au lieu de 2

Message par BrigitteG »

Merci à vous deux d'avoir pris le temps de m'aider. :D

J'ai utilisé l'exemple de Vazymimil qui répond à ma demande. :D

Je peux très avoir du UM avec du EM (ou inversement) ou que du EM ou que du UM.

Bonne après-midi & bonnes fêtes

Répondre