Problème de requête

Le
Clark [MVP CRM]
Bonjour
J'ai un petit souci avec une requête.
Plutôt que de longues explications, j'ai fait un exemple

declare @compte table
(idCompte int identity not null,
libelle char(16)not null)
insert into @compte (libelle) values ('Compte1'), ('Compte2'), ('Compte3'),
('Compte4')

declare @operations table
(idOperation int identity not null,
montant money not null,
datevaleur date not null,
idCompte int not null,
idCompteOrigine int null)

insert into @operations
(montant, datevaleur, idCompte)
values
(123.36, '12/06/2009', 2)
,(123.36, '12/06/2009',2)
,(123.36, '12/06/2009',2)

declare @versements table
(idVersement int identity not null,
montant money not null,
datevaleur date not null,
idCompteOrigine int not null,
idCompteVersement int null)

insert into @versements
(montant, datevaleur, idCompteOrigine, idCompteVersement)
values
(123.36, '12/06/2009', 1,2)
,(123.36, '12/06/2009',3,2)
,(123.36, '12/06/2009',4,2)


select * from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur)

update @operations
set idCompteOrigine = c.idCompte
from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur and
v.idCompteVersement = o2.idCompte)

select * from @operations

Je veux mettre à jour ma table @operations avec les id des comptes qui ont
fait les versements, seulement les 3 versements étant strictement identiques
je n'arrive pas à associer chaque opération avec un compte différent à
chaque fois.
Quelqu'un saurait-il comment faire?
Merci
Geoffroy
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Med Bouchenafa
Le #19668521
Quel serait l'état final de la table @operations que tu veux obtenir?

--
Bien Cordialement
Med Bouchenafa

"Clark [MVP CRM]" news:
Bonjour
J'ai un petit souci avec une requête.
Plutôt que de longues explications, j'ai fait un exemple

declare @compte table
(idCompte int identity not null,
libelle char(16)not null)
insert into @compte (libelle) values ('Compte1'), ('Compte2'),
('Compte3'), ('Compte4')

declare @operations table
(idOperation int identity not null,
montant money not null,
datevaleur date not null,
idCompte int not null,
idCompteOrigine int null)

insert into @operations
(montant, datevaleur, idCompte)
values
(123.36, '12/06/2009', 2)
,(123.36, '12/06/2009',2)
,(123.36, '12/06/2009',2)

declare @versements table
(idVersement int identity not null,
montant money not null,
datevaleur date not null,
idCompteOrigine int not null,
idCompteVersement int null)

insert into @versements
(montant, datevaleur, idCompteOrigine, idCompteVersement)
values
(123.36, '12/06/2009', 1,2)
,(123.36, '12/06/2009',3,2)
,(123.36, '12/06/2009',4,2)


select * from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur)

update @operations
set idCompteOrigine = c.idCompte
from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur and
v.idCompteVersement = o2.idCompte)

select * from @operations

Je veux mettre à jour ma table @operations avec les id des comptes qui ont
fait les versements, seulement les 3 versements étant strictement
identiques je n'arrive pas à associer chaque opération avec un compte
différent à chaque fois.
Quelqu'un saurait-il comment faire?
Merci
Geoffroy


Clark [MVP CRM]
Le #19668961
Bonjour
Quelque chose comme ça
idOperation montant datevaleur idCompte idCompteOrigine
1 123,36 2009-06-12 2 1
2 123,36 2009-06-12 2 3
3 123,36 2009-06-12 2 4
Pour détailler j'ai 3 versements identiques de 3 comptes différents sur le
même compte.
Je dois modifer ma table @operations pour indiquer la provenance du
versement. Comme ce sont les 3 mêmes, peu importe l'ordre d'affectation,
mais il faut que j'arrive sur l'update à affecter à chaque fois un compte
origine différent.
J'espère arriver à me faire comprendre!
Merci
Geoffroy

"Med Bouchenafa" news:
Quel serait l'état final de la table @operations que tu veux obtenir?

--
Bien Cordialement
Med Bouchenafa

"Clark [MVP CRM]" news:
Bonjour
J'ai un petit souci avec une requête.
Plutôt que de longues explications, j'ai fait un exemple

declare @compte table
(idCompte int identity not null,
libelle char(16)not null)
insert into @compte (libelle) values ('Compte1'), ('Compte2'),
('Compte3'), ('Compte4')

declare @operations table
(idOperation int identity not null,
montant money not null,
datevaleur date not null,
idCompte int not null,
idCompteOrigine int null)

insert into @operations
(montant, datevaleur, idCompte)
values
(123.36, '12/06/2009', 2)
,(123.36, '12/06/2009',2)
,(123.36, '12/06/2009',2)

declare @versements table
(idVersement int identity not null,
montant money not null,
datevaleur date not null,
idCompteOrigine int not null,
idCompteVersement int null)

insert into @versements
(montant, datevaleur, idCompteOrigine, idCompteVersement)
values
(123.36, '12/06/2009', 1,2)
,(123.36, '12/06/2009',3,2)
,(123.36, '12/06/2009',4,2)


select * from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur)

update @operations
set idCompteOrigine = c.idCompte
from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur and
v.idCompteVersement = o2.idCompte)

select * from @operations

Je veux mettre à jour ma table @operations avec les id des comptes qui
ont fait les versements, seulement les 3 versements étant strictement
identiques je n'arrive pas à associer chaque opération avec un compte
différent à chaque fois.
Quelqu'un saurait-il comment faire?
Merci
Geoffroy





Med Bouchenafa
Le #19673611
Désolé, je ne vois pas trop
il faut probablement quelque chose de plus discriminant

--
Bien Cordialement
Med Bouchenafa

"Clark [MVP CRM]" news:
Bonjour
Quelque chose comme ça
idOperation montant datevaleur idCompte idCompteOrigine
1 123,36 2009-06-12 2 1
2 123,36 2009-06-12 2 3
3 123,36 2009-06-12 2 4
Pour détailler j'ai 3 versements identiques de 3 comptes différents sur le
même compte.
Je dois modifer ma table @operations pour indiquer la provenance du
versement. Comme ce sont les 3 mêmes, peu importe l'ordre d'affectation,
mais il faut que j'arrive sur l'update à affecter à chaque fois un compte
origine différent.
J'espère arriver à me faire comprendre!
Merci
Geoffroy

"Med Bouchenafa" news:
Quel serait l'état final de la table @operations que tu veux obtenir?

--
Bien Cordialement
Med Bouchenafa

"Clark [MVP CRM]" news:
Bonjour
J'ai un petit souci avec une requête.
Plutôt que de longues explications, j'ai fait un exemple

declare @compte table
(idCompte int identity not null,
libelle char(16)not null)
insert into @compte (libelle) values ('Compte1'), ('Compte2'),
('Compte3'), ('Compte4')

declare @operations table
(idOperation int identity not null,
montant money not null,
datevaleur date not null,
idCompte int not null,
idCompteOrigine int null)

insert into @operations
(montant, datevaleur, idCompte)
values
(123.36, '12/06/2009', 2)
,(123.36, '12/06/2009',2)
,(123.36, '12/06/2009',2)

declare @versements table
(idVersement int identity not null,
montant money not null,
datevaleur date not null,
idCompteOrigine int not null,
idCompteVersement int null)

insert into @versements
(montant, datevaleur, idCompteOrigine, idCompteVersement)
values
(123.36, '12/06/2009', 1,2)
,(123.36, '12/06/2009',3,2)
,(123.36, '12/06/2009',4,2)


select * from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur)

update @operations
set idCompteOrigine = c.idCompte
from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur and
v.idCompteVersement = o2.idCompte)

select * from @operations

Je veux mettre à jour ma table @operations avec les id des comptes qui
ont fait les versements, seulement les 3 versements étant strictement
identiques je n'arrive pas à associer chaque opération avec un compte
différent à chaque fois.
Quelqu'un saurait-il comment faire?
Merci
Geoffroy








Patrice
Le #19677421
Utiliser un UPDATE est til obligatoire ? Dans ce cas de figure, le plus
simple serait probablement de supprimer/résinsérer les lignes concernées
plutôt que de faire un update. Mais le cas réel est sans doute plus complexe
?

Si ce n'est pas un exercice ou une opération tout à fait exceptionnelle, je
pense qu'il y a un problème de conception. L'opération devrait sans doute
garder trace du versement dont elle est issue (avec des PK donc) pour
pouvoir la mettre à jour si le versement est modifiée. Cette modification
devient alors bien plus facile qu'elle que soit la donnée modifiée...

--
Patrice

"Clark [MVP CRM]" discussion :
Bonjour
J'ai un petit souci avec une requête.
Plutôt que de longues explications, j'ai fait un exemple

declare @compte table
(idCompte int identity not null,
libelle char(16)not null)
insert into @compte (libelle) values ('Compte1'), ('Compte2'),
('Compte3'), ('Compte4')

declare @operations table
(idOperation int identity not null,
montant money not null,
datevaleur date not null,
idCompte int not null,
idCompteOrigine int null)

insert into @operations
(montant, datevaleur, idCompte)
values
(123.36, '12/06/2009', 2)
,(123.36, '12/06/2009',2)
,(123.36, '12/06/2009',2)

declare @versements table
(idVersement int identity not null,
montant money not null,
datevaleur date not null,
idCompteOrigine int not null,
idCompteVersement int null)

insert into @versements
(montant, datevaleur, idCompteOrigine, idCompteVersement)
values
(123.36, '12/06/2009', 1,2)
,(123.36, '12/06/2009',3,2)
,(123.36, '12/06/2009',4,2)


select * from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur)

update @operations
set idCompteOrigine = c.idCompte
from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur and
v.idCompteVersement = o2.idCompte)

select * from @operations

Je veux mettre à jour ma table @operations avec les id des comptes qui ont
fait les versements, seulement les 3 versements étant strictement
identiques je n'arrive pas à associer chaque opération avec un compte
différent à chaque fois.
Quelqu'un saurait-il comment faire?
Merci
Geoffroy


Clark [MVP CRM]
Le #19680651
Bonjour
Oui le cas réel est effectivement plus complexe et m'oblige à faire un
update. Je récupére les données à mettre à jour d'un export d'une autre base
avec un certain nombre d'infos et je récupère ensuite d'un fichier plat,
d'autres infos complémentaires.
Bon je vais continuer à chercher.
Merci
Geoffroy

"Patrice" news:O2PdaVm%
Utiliser un UPDATE est til obligatoire ? Dans ce cas de figure, le plus
simple serait probablement de supprimer/résinsérer les lignes concernées
plutôt que de faire un update. Mais le cas réel est sans doute plus
complexe ?

Si ce n'est pas un exercice ou une opération tout à fait exceptionnelle,
je pense qu'il y a un problème de conception. L'opération devrait sans
doute garder trace du versement dont elle est issue (avec des PK donc)
pour pouvoir la mettre à jour si le versement est modifiée. Cette
modification devient alors bien plus facile qu'elle que soit la donnée
modifiée...

--
Patrice

"Clark [MVP CRM]" de discussion :
Bonjour
J'ai un petit souci avec une requête.
Plutôt que de longues explications, j'ai fait un exemple

declare @compte table
(idCompte int identity not null,
libelle char(16)not null)
insert into @compte (libelle) values ('Compte1'), ('Compte2'),
('Compte3'), ('Compte4')

declare @operations table
(idOperation int identity not null,
montant money not null,
datevaleur date not null,
idCompte int not null,
idCompteOrigine int null)

insert into @operations
(montant, datevaleur, idCompte)
values
(123.36, '12/06/2009', 2)
,(123.36, '12/06/2009',2)
,(123.36, '12/06/2009',2)

declare @versements table
(idVersement int identity not null,
montant money not null,
datevaleur date not null,
idCompteOrigine int not null,
idCompteVersement int null)

insert into @versements
(montant, datevaleur, idCompteOrigine, idCompteVersement)
values
(123.36, '12/06/2009', 1,2)
,(123.36, '12/06/2009',3,2)
,(123.36, '12/06/2009',4,2)


select * from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur)

update @operations
set idCompteOrigine = c.idCompte
from @compte c
inner join @versements v on c.idCompte = v.idCompteOrigine
inner join @operations o on o.idOperation = (select top 1 o2.idOperation
from @operations o2
where v.montant = o2.montant and v.datevaleur = o2.datevaleur and
v.idCompteVersement = o2.idCompte)

select * from @operations

Je veux mettre à jour ma table @operations avec les id des comptes qui
ont fait les versements, seulement les 3 versements étant strictement
identiques je n'arrive pas à associer chaque opération avec un compte
différent à chaque fois.
Quelqu'un saurait-il comment faire?
Merci
Geoffroy






Publicité
Poster une réponse
Anonyme