1 pièce(s) jointe(s)
Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions
Bonjour les membres du forum,
j'utilisais un logiciel (ACL GALVANIZE) fonctionnant un peu sur le mode des bases de données, je suis passé à sql server; et je ne parviens pas à retrouver certaines fonctionnalités.
je cherche à Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions, au cas présent il s'agirait :
-de créer un colonne NumCompte qui se rempli avec la valeur de la colonne 1 si le mot "Compte" est trouvé dans l'enregistrement ex "set NUCPTE1 = column1 where column1 like '%Compte%' ", pour cette étape pas de problème
-mais ensuite et là je bloque, je souhaite que les NULL soient remplacés par la valeur de l'enregistrement du dessus pour arriver au résultat de l'étape 3.
Citation:
Etape 1 colonne 1
Compte 15450 11100055511
11/06/2018 virement vers DGFIP – 1 100, 75
14/02/19 paiement carte la cantine a chouchou
echeance du 14/01/19 – 75,92
Compte 14444 40540775842
12/07/19 remise cheque 177892 2 000 000
14/07/19 prelevement la redoute kls0000125478
Echeance 2 -367
Citation:
Etape 2 colonne NumCompte
Compte 15450 11100055511
NULL
NULL
NULL
Compte 14444 40540775842
NULL
NULL
NULL
Citation:
Etape 3 colonne NumCompte 2
Compte 15450 11100055511
Compte 15450 11100055511
Compte 15450 11100055511
Compte 15450 11100055511
Compte 14444 40540775842
Compte 14444 40540775842
Compte 14444 40540775842
Compte 14444 40540775842
J'ai fait des essais divers et variés mais mes syntaxes ne sont pas acceptées.... j'ai essayé également en mettant un n° ID auto-incrémenté pour tenter de dire "si ne trouve pas "compte" dans la ligne alors mettre la valeur de la ligne du dessus sans grand succès :
Code:
1 2 3 4 5 6
| update [CMUT].[dbo].[CMUT]
set NUCPTE2 = case
when NumCompte like '%compte%' then NumCompte
when NumCompte = NOT LIKE '%compte%' then NumCompte where ID=ID-1
end
go |
Voilà, je m'en remets à votre ingéniosité et à votre expérience, la table est en PJ en fichier .TXT au besoin.
Merci!
1 pièce(s) jointe(s)
suite Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions
Bonjour Tatayo,
Tout d'abord merci d'avoir pris le temps de répondre, et je vais tâcher d'assimiler rapidement les règles du forum.
Alors, après avoir créé la base et la table via l'explorateur d'objet de sql server (version 18.8), à partir du fichier TXT en pièce jointe (fichier TXT pour import données initiales), je pense que cela constitue le jeu d'essai
j'ai saisi le début de requête suivant, là je pense qu'il s'agit du DDL?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| --*************création colonne ID auto incrémentée
ALTER TABLE [TestImport].[dbo].[ImportDonnees]
ADD id_num int IDENTITY(1,1)
go
--*************création colonne NUMCPTE1
ALTER TABLE [TestImport].[dbo].[ImportDonnees]
ADD NUMCPTE1 varchar(225)
go
UPDATE [TestImport].[dbo].[ImportDonnees]
SET NUMCPTE1 = column1 where column1 LIKE '%15519%'
go |
et ensuite voilà en image (faite avec un tableur pour l'occasion) du résultat attendu si cela est possible toutefois :
Pièce jointe 595868
Concrètement, on a dans la colonne "A" de l'image les données brutes, dans la colonne B "ID" pour avoir l'ordre initial des lignes, et le but est :
-1/qu'à chaque fois que la chaine '15519', qui identifie ici la présence d'un numéro de compte, est trouvée les données de la A sont placées dans la colonne C (c'est le résultat actuel de la requête), les lignes où la condition n'est pas remplie s'affichent NULL pour l'instant
2/ que la valeur de chaque enregistrement non NULL de la colonne C "NUMCPTE1 résultat actuel", donc contenant un numéro de compte, s'inscrive dans tous les enregistrements NULLS suivants, puis dès qu'un enregistrement est non NULL, c'est celui ci qui sera inscrit sur les suivants et ainsi de suite comme dans la colonne D de l'image.
Donc, ici, la colonne D prend la valeur de la colonne C ID 1 de ID 1 à 11 puis la colonne D prend la valeur de la colonne C ID12 de ID 12 à ID 22
Je précise que cela vaut le coup car les vrais fichiers ont une taille beaucoup plus importante et cela me servira très souvent, pour rattacher la référence du compte à chaque mouvement
Est ce que c'est suffisamment détaillé et documenté comme cela?
Merci!
2 pièce(s) jointe(s)
suite 2 Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions
Bonjour Tatayo et JeitEmgie,
Zut l'image du résultat attendu s'affichait en prévisualisation, je la mets en pièce jointe avec également en format tableur le résultat attendu.
Je ne créé pas la table avec un script, j'importe la table par clic droit sur la base de données nommée TestImport=> tasks=> import flat file => et je sélectionne le fichier txt "fichier TXT pour import des données initiales" en PJ. La table a donc au départ une seule colonne
Ensuite, j'écris la requête suivante
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| --*************création colonne ID auto incrémentée
ALTER TABLE [TestImport].[dbo].[ImportDonnees]
ADD id_num int IDENTITY(1,1)
go
--*************création colonne NUMCPTE1
ALTER TABLE [TestImport].[dbo].[ImportDonnees]
ADD NUMCPTE1 varchar(225)
go
UPDATE [TestImport].[dbo].[ImportDonnees]
SET NUMCPTE1 = column1 where column1 LIKE '%15519%'
go |
Sinon, par click droit sur la table dans l'explorateur d'objets => puis script table as =>create table to=>new query editor window, j'ai le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| USE [TestImport]
GO
/****** Object: Table [dbo].[ImportDonnees] Script Date: 18/04/2021 10:48:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ImportDonnees](
[column1] [nvarchar](100) NOT NULL,
[id_num] [int] IDENTITY(1,1) NOT NULL,
[NUMCPTE1] [varchar](225) NULL,
[NUMCPTE2] [varchar](225) NULL
) ON [PRIMARY]
GO |
Par rapport à la notion d'enregistrement suivant ou précédent tu expliques que les lignes d'une table ne sont pas ordonnées dans la base de données.
et que donc il faut une donnée dans la table qui permette ce tri, et donc de savoir qi précède qui.
Tu expliques également que l'ID auto-incrémenté ne garantit pas "l'ordre" des lignes, et ne "protège" pas de la présence de trous dans la numérotation.
Disons pour ce cas que L'ID est fiable, car ici pour l'exemple l'ID débute à 1 et fini à 22, et suit bien l'ordre désiré de la colonne 1. Il y a des trous dans la colonne 1, c'est à dire des enregistrements vides mais ce n'est pas un problème pour moi (cf le tableur en PJ)
On doit donc je suppose pour voir faire un tri par n°ID, qui ne changera rien au l'ordre des enregistrements de la colonne 1 à priori.
Tu indiques qu'il faut un critère de regroupement permettant relier à une ligne X (celle sans les NULLs) toutes les autres qui lui sont liées et qui doivent être mise à jour.
Avec l'exemple du tableur en pièce jointe, puis je par exemple trier les enregistrements par ID (si ce tri est nécessaire) et exprimer la chose suivante :
-l'enregistrement contenant l'ID 1 contiendra toujours un numéro de compte, donc la condition si dans l'enregistrement contenant l'ID1 la colonne "Column1" LIKE '%15519%' (donc contient cette chaine de caractères), alors mettre cette valeur en colonne NUMCPTE1 du même enregistrement sera toujours vraie, et le numéro de compte contenu en dans "column1" sera inscrit dans la colonne "NUMCPTE1"
-si à la ligne ID2 la colonne "Column1" LIKE '%15519%' (donc contient cette chaine de caractères), alors mettre cette valeur en colonne NUMCPTE1 du même enregistrement la colonne "Column1" ne contient pas cette chaine de caractère, alors NUMCPTE1 de la "ligne" ID2 prend la valeur de NUMCPTE1 de la "ligne" ID1 , (ainsi pas de problème de "NULLS") et ainsi de suite.
Chez ACL galvanize, ils utilisaient une fonction recoffset, que je ne trouve pas en sql, permettant comme désiré ici de faire appel à d'autres enregistrements qui seraient ici définis par leur n° ID par exemple
Alors alors...est possible par ce biais ou un autre?
Bonne journée!
Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions
Bonsoir tout le monde,
SQLPro, merci, j'ai parcouru vos explications https://sqlpro.developpez.com/cours/sqlaz/erreurs/#L5
Le fait est que pour mon cas, je serai le seul utilisateur, je ne serai pas amené à supprimer d'enregistrements et mes données ne dépasseront jamais quelques milliers de lignes. MAIS je comprends bien votre image du sac de bille et les incertitudes du "classement" par un n° d'ID, je reconnais volontiers mes lacunes.
A vous lire, si je comprends bien (avec réserves) "TIMESTAMP pour MS SQL Server) assure d'avoir toujours une colonne dont toutes les valeurs sont distinctes et croissantes en fonction du moment de l'insertion."
Cela règlerai donc bien le problème de "l'ordre" des enregistrements? et serait il alors possible de répondre à l'objectif initial?
Bonne Soirée, Jéjér.
Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions
Hello SQL et les autres volontaires,
Ca semble semé d'embuches, mais il ne faut pas désespérer.
bon alors je vais simplifier l'hypothèse à l'extrême :
-j'ai une table ne contenant que 2 enregistrements, pas un de plus, aucun ne sera ajouté, ni supprimé ;
-la table contient donc 2 enregistrements, disons deux colonnes : une colonne A et une colonne B
-pour le 1er enregistrement en colonne A "Bonjour" et en colonne B "ça va?"
-pour le second enregistrement en colonne A "Bonjour" également, en colonne B rien à ce stade
Existe t-'il un moyen d'inscrire en colonne B du second enregistrement la valeur la colonne B du 1er enregistrement, je dis du 1er mais l'appellation est erronée, disons du seul autre enregistrement, ou de l'enregistrement contenant la chaîne "ça va" en colonne B.
Donc, il y a t-il un moyen qu'un enregistrement prenne des "valeurs" d'un autre enregistrement?
Et si oui...lequel 8O
Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions
Bonjour Tatayo et Escartefigue,
Merci, je m'y attelle ce week end et vous tient au courant!
bonne soirée.
Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions
Escartefigue,
et si à la place de remplacer la valeur de tous les enregistrements de T1 data (cf ton code dans ton précédent post) par la valeur max de T1 data je souhaitais utiliser une condition du type :
-Si T1id = 1 alors T1data = valeur de T1 où T1data contient 'AZER'
-sinon (donc si T1id = 2 ou 3) alors T1data = valeur de T1 où T1data contient 'zz'
on aurait ainsi en successivement en T1data :
-AZER car T1id = est bien égal à 1
-ZZZZ car T1id = 2 donc n'est pas = à 1
-ZZZZ car T1id = 3 donc n'est pas = à 1
maintenant que grâce à vous j'ai la confirmation que je peux donner à enregistrement la valeur d'un autre en usant d'une condition (dans ton exemple avec MAX), je suppose que c'est possible mais ma syntaxe n'est pas bonne :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| create table T1(T1id integer not null,
T1data char(4) not null)
;
insert into T1(T1id, T1data)
values (1, 'abcd'), (2, 'zzzz'), (3, 'AZER')
;
update T1
SET t1data = CASE
WHEN T1id = 1 THEN T1data where T1data like 'AZER'
ELSE T1data where T1data like 'zzzz'
END
go |
Ce n'est peut être pas grand chose à modifier, vous avez une piste?
Merci!
Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions
Bonjour Tatayo,
là non je suis perdu, nul surement, mais perdu tout de même:)
si je reprend le début du code créant la table
Code:
1 2 3 4 5 6
| create table T1(T1id integer not null,
T1data char(4) not null)
;
insert into T1(T1id, T1data)
values (1, 'abcd'), (2, 'zzzz'), (3, 'AZER')
; |
et que j'ajoute ton code en adaptant les noms
Code:
1 2 3 4
| select source.*,cible.*
from T1 as source
inner join T1 as cible on ???
where (source.data like '%AZER%' and cible.id = 1) or (source.data like '%ZZZ%' and cible.id <> 1) |
source c'est la table T1, et cible? je dois créer une table cible avant?
que sont les 3 points d'interrogation de la ligne inner join?
et quand tu mets (ou vous mettez on n'aime pas toujours être tutoyé) source.data , le data est bien le nom de la colonne contenant l'info?
Je sais que je dois être un peu agaçant à ne pas comprendre, mais quand j'aurais compris, je serai bien content!
Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions
hello!
non en fait je m'interrogeais sur la réponse de Tatayo du 24/04/21, je cherchais à utiliser une condition du type :
-Si T1id = 1 alors T1data = valeur de T1 où T1data contient 'AZER'
-sinon (donc si T1id = 2 ou 3) alors T1data = valeur de T1 où T1data contient 'zz'
on aurait ainsi en successivement en T1data :
-AZER car T1id = est bien égal à 1
-ZZZZ car T1id = 2 donc n'est pas = à 1
-ZZZZ car T1id = 3 donc n'est pas = à 1
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| create table T1(T1id integer not null,
T1data char(4) not null)
;
insert into T1(T1id, T1data)
values (1, 'abcd'), (2, 'zzzz'), (3, 'AZER')
;
update T1
SET t1data = CASE
WHEN T1id = 1 THEN T1data where T1data like 'AZER'
ELSE T1data where T1data like 'zzzz'
END
go |
Tatayo indiquait dans sa réponse un code que je ne parviens pas à comprendre
Code:
1 2 3 4
| select source.*,cible.*
from LaTable as source
inner join LaTable as cible on ???
where (source.data like '%AZER%' and cible.id = 1) or (source.data like '%ZZZ%' and cible.id <> 1) |
j'en suis resté là pour l'instant;)