par
dav06200 » 31 mars 2015, 17:30
Bonjour,
Je fais appel à l'aide et lance une problématique sur une méthode sql pour éliminer des valeurs considérées comme "en double" sur chaque lignes d'entrée d'une table.
En résumé voici le schémas :
Une table A qui collecte les donnée "brute" sur 40 commandes (services) possible par facture
N°facture - Service1 - Service2 - Service3 - Service4- Service5 - ....Etc jusqu'a 40
000001 VAA Null VAA SFG SFG
000002 YBB SFU Null YBB Null
000003 Null Null SAE SFU SFU
000004 VDP VBB VBB VAA VDP
etc....
Le but est d'obtenir la table B suivante
N°facture - Service1 - Service2 - Service3 - Service4 - Service5........etc..
000001 VAA Null Null SFG Null
000002 YBB SFU Null Null Null
000003 Null Null SAE SFU Null
000004 VDP VBB Null VAA Null
Les factures ne doivent être adressées qu'une seule fois au responsable service car il signe une seule fois pour l'ensemble peut importe qu'il soit mentionné 2, 5 ou 10 fois sur la facture.
La solution brutale que j'ai trouvée et de mettre en table temp les données des services précédent (exemple pour tester la mise à jour du service3 ,je regarde si dans la table temp des 2 valeurs précédente , celle-ci n'existe pas déjà) :
with temp as (select N°facture,service1 as serv1, service2 as serv2) from table A
insert into table B (N°facture,Service3)
select a.N°facture, a.Service3 as serv3
from TableA a
Left Join temp
on temp.N°facture=a.N°facture
Where serv1<>a.service3 And serv2<>a.service3
Le problème de cette méthode c'est qu'il faut tester les 40 services ce qui devient imbuvable à écrire dès le 6ieme ou 7ieme déjà ...
Je pense qu'il doit y avoir une méthode plus rapide (Rownumber() etc....) mais je sèche..
Bonjour,
Je fais appel à l'aide et lance une problématique sur une méthode sql pour éliminer des valeurs considérées comme "en double" sur chaque lignes d'entrée d'une table.
En résumé voici le schémas :
Une table A qui collecte les donnée "brute" sur 40 commandes (services) possible par facture
N°facture - Service1 - Service2 - Service3 - Service4- Service5 - ....Etc jusqu'a 40
000001 VAA Null VAA SFG SFG
000002 YBB SFU Null YBB Null
000003 Null Null SAE SFU SFU
000004 VDP VBB VBB VAA VDP
etc....
Le but est d'obtenir la table B suivante
N°facture - Service1 - Service2 - Service3 - Service4 - Service5........etc..
000001 VAA Null Null SFG Null
000002 YBB SFU Null Null Null
000003 Null Null SAE SFU Null
000004 VDP VBB Null VAA Null
Les factures ne doivent être adressées qu'une seule fois au responsable service car il signe une seule fois pour l'ensemble peut importe qu'il soit mentionné 2, 5 ou 10 fois sur la facture.
La solution brutale que j'ai trouvée et de mettre en table temp les données des services précédent (exemple pour tester la mise à jour du service3 ,je regarde si dans la table temp des 2 valeurs précédente , celle-ci n'existe pas déjà) :
with temp as (select N°facture,service1 as serv1, service2 as serv2) from table A
insert into table B (N°facture,Service3)
select a.N°facture, a.Service3 as serv3
from TableA a
Left Join temp
on temp.N°facture=a.N°facture
Where serv1<>a.service3 And serv2<>a.service3
Le problème de cette méthode c'est qu'il faut tester les 40 services ce qui devient imbuvable à écrire dès le 6ieme ou 7ieme déjà ...
Je pense qu'il doit y avoir une méthode plus rapide (Rownumber() etc....) mais je sèche..