IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Assigner à un enregistrement la valeur de l'enregistrement au dessus sous conditions


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut 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.

    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

    Etape 2 colonne NumCompte
    Compte 15450 11100055511
    NULL
    NULL
    NULL
    Compte 14444 40540775842
    NULL
    NULL
    NULL

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    IL n'existe pas de notion "d'enregistrement de dessus" en SQL, es lignes d'une table en base ne sont pas triées.
    Donc ici il nous faudrait un jeu d'essai complet, car celui que tu nous fournis ne permet pas de trier les lignes :
    Compte 15450 11100055511
    NULL => Quelle est la différence entre cette ligne et la suivante ?
    NULL
    NULL
    Compte 14444 40540775842 => pourquoi cette ligne est-elle ici, et non en deuxième place ?
    NULL => quelle est la différence entre cette ligne et celle "deux rangs" plus haut ?
    NULL
    NULL

    Donc comme indiqué dans la charte, il nous faut la description des tables impliques (le DDL), un jeu d'essai complet et le résultat attendu.

    Tatayo.

  3. #3
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    L'image ne s'affiche pas (le lien semble invalide), donc difficile de répondre.

    Le DDL est le script SQL de création des tables (CREATE TABLE).

    Quoi qu'il en soit il faut définir la notion de suivant, car les lignes d'une table ne sont pas ordonnées dans la base de données.
    Il n'y a donc pas de ligne suivante ou précédente, il faut une donnée dans la table qui permette ce tri, et donc de savoir qi précède qui.
    Attention, un 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.

    Mais je pense qu'ici il ne faut en fait pas parler de ligne suivante ou précédente, mais de critère de regroupement, critère qui permet de relier à une ligne X (celle sans les NULLs) toutes les autres qui lui sont liées et qui doivent être mise à jour.

    Ou revoir la modélisation, pour que cette mise à jour (qui ressemble à de la duplication d'info) ne soit plus nécessaire. Mais c'est une autre histoire, si tant est que ce soit possible ici.

    Tatayo.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    https://www.itprotoday.com/sql-serve...on-null-puzzle
    https://stackoverflow.com/questions/...-in-sql-server

    NB
    Azure SQL Edge (
    https://docs.microsoft.com/en-us/sql/t-sql/functions/last-value-transact-sql?view=sql-server-ver15)
    et ORACLE (https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions073.htm) supportent
    IGNORE NULLS sur les fonctionnalisés de windowing (first_value, last_value, lead, lag) ce qui simplifie la solution au problème.

    (reste qu'il vous faut un critère cohérent de ORDER BY...)


  6. #6
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!
    Fichiers attachés Fichiers attachés

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Jéjér78 Voir le message
    ....
    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)....
    Encore une fois vous partez d'un postulat qui vous semble vrai alors qu'il est totalement faux.... Le jours ou vous aurez de multiples utilisateurs ou un gros volume de données, les ID pourrons être entrelacés par de multiples utilisateurs insérant en même temps et le fait du parallélisme pourra vous montrer des données totalement désordonnées.

    Tant que vous ne comprendrez pas cela et ne prendrez pas les dispositions qui s'impose pour avoir un moyen certain et logique de trouver ces lignes sans présupposer que par magie elle seront toujours rangées, il sera impossible de vous répondre.
    A me lire :
    https://sqlpro.developpez.com/cours/sqlaz/erreurs/#L5

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut 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.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Jéjér78 Voir le message
    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.
    Absolument pas. TIMESTAMP est réaffecté à chaque UPDATE...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut 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

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Tu peux utiliser une jointure dans une requête UPDATE.
    Pour coller à ton exemple, ça donnerait une requête de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    update t1 set t1.coly = t2.coly
    from LaTable as t1
    inner join LaTable as t2
    on t1.colx = t2.colx and t1.coly is null
    Tu peux noter, comme on le disait plus haut, qu'il n'y a pas de notion de rang ici.
    Il faut juste un critère qui permet de faire le lien entre les lignes à mettre à jour, et la ligne qui sert de "référence", i.e. qui contient les données à récupérer.


    Tatayo.

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    rien de plus simple, il faut pour ça un critère de sélection de la valeur à retenir.

    Dans l'exemple ci-dessous, c'est la valeur maxi de la colonne que j'assigne aux autres lignes :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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 = (select max(T1data)
                  from T1)
    ;

    Contenu avant :
    T1id T1data
    1 abcd
    2 zzzz
    3 AZER

    Contenu après :
    T1id T1data
    1 zzzz
    2 zzzz
    3 zzzz

  13. #13
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut 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.

  14. #14
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    A mon avis tu devrais pour l'instant mettre de côté la mise à jour des données, et "mettre au point" les jointures et critères de sélection pour faire le lien entre les lignes "sources" et "cibles", dans un simple SELECT.

    Uns fois que ce point sera réglé on pourra passer à une requête de mise à jour, ce qui ne sera dès lors plus très compliqué.
    Si je reprends ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    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)
    Avant de me faire taper sur les doigts, j'ai mis des * dans le SELECT (sacrilège !) car ici il s'agit juste d'une requête pour avancer dans la résolution du problème, et non d'une requête qui partira en production.

    Ici il ne reste plus qu'à compléter cette requête pour avoir les bonnes correspondances source <> cible.

    Tatayo.

  16. #16
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  17. #17
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonjour,

    Citation Envoyé par Jéjér78 Voir le message
    source c'est la table T1, et cible? je dois créer une table cible avant?
    si on suit la logique de la demande, tu voudrais créer 2 tables au même nom ?

    Un alias de table n'existe que pour et pendant la requête.

    si tu préfères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select source.*, cible.*
    from
    (select * from t1 ) as source
    cross join (select * from t1 ) as cible
    Si T1 n'a que 4 lignes et 2 colonnes, tu obtiens un joli tableau de 4 colonnes (2+2) et 16 lignes (4*4) ; ce qu'on appelle un produit cartésien.
    Le savoir est une nourriture qui exige des efforts.

  18. #18
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Ici le but est de copier des données d'une ligne d'une table vers d'autres lignes de la même table.
    Donc dans la requête il faut utiliser deux fois la même table, d'où l'utilisation d'alias:
    • Source : représente les lignes à partir desquelles il faut récupérer la valeur
    • Cible : représente les lignes à mettre à jour

    Ensuite il faut faire le lien entre les lignes sources (donc l'alias source dans la requête) et les lignes cibles (donc l'alias cible dans la requête).
    L'enjeux ici est de déterminer le lien en question, c'est le critère de jointure de la requête, les fameux "???" que j'ai mis dans ma requête.

    C'est pour cette raison que j'indiquais que la première chose à faire est de trouver ce critère de jointure, et dans une requête SELECT pour avoir le résultat de visu.
    Une fois que ce point sera réglé, il sera facile de transposer le tout dans une requête UPDATE.

    Tatayo.

  20. #20
    Candidat au Club
    Homme Profil pro
    débutant BDD
    Inscrit en
    Avril 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant BDD
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2021
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Bonjour Tatayo,

    ok, j'ai compris la réponse entre source et cible, merci.

    si j'adapte à mon début de code, et que je donne l'instruction de jointure qui suit, ms server va bien m'afficher les données de la table source et de la cible sur le critère spécifié (là où il trouve AZER et où id = 3)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table T1(T1id    integer not null,
                    T1data  char(4) not null)
    ;
    insert into T1(T1id, T1data)
    values (1, 'abcd'), (2, 'zzzz'), (3, 'AZER')
    ;
     
    select source.*,cible.*
    from [TestImport].[dbo].[T1] as source
    inner join [TestImport].[dbo].[T1] as cible on source.T1data=cible.T1data
    where (source.T1data like '%AZER%' and cible.T1id = 3)

    Et donc si je veux joindre l'enregistrement source où Id= 1 avec l'enregistrement de la table cible où Id=2 et bien là la sélection ne retourne aucun enregistrement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select source.*,cible.*
    from [TestImport].[dbo].[T1] as source
    inner join [TestImport].[dbo].[T1] as cible on source.T1data=cible.T1data
    where (source.T1id= 1 and cible.T1id=2)

    comment faudrait-il l'écrire?

    Bonne soirée!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/06/2010, 05h16
  2. enregistrer lignes fichier sous condition
    Par makohsarah dans le forum Langage
    Réponses: 1
    Dernier message: 21/08/2006, 15h46
  3. XP "enregistrer l'image sous" : formats disparus !
    Par NEXUS6 dans le forum Windows XP
    Réponses: 7
    Dernier message: 18/12/2005, 11h08
  4. Limiter nombre d'enregistrement d'un sous-formulaire
    Par snoopy69 dans le forum Access
    Réponses: 12
    Dernier message: 26/10/2005, 17h03
  5. Réponses: 4
    Dernier message: 16/09/2005, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo