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 :

SQL: Remplacer les valeurs NULL par la valeur précédente dans le champs ?


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 107
    Points : 57
    Points
    57
    Par défaut SQL: Remplacer les valeurs NULL par la valeur précédente dans le champs ?
    Bonjour,

    En pièce-jointe, Voici le résultat d'une table temporaire (sous MS SQL Server),
    les données sont triées par rapport a la Date

    Objectif : remplacer les champs NULL par la valeur précédente (final => plus de case avec la valeur NULL) en langage SQL (SELECT, CASE, THEN, ....) ???

    Note: La table ne contient pas de clé primaire

    Exemple pour la ligne 57:
    2010-09-29 16:02:06.107 46 NULL
    Devrait devenir
    2010-09-29 16:02:06.107 46 0

    Exemple pour la ligne 58:
    2010-09-29 16:02:08.093 NULL -2
    Devrait devenir
    2010-09-29 16:02:08.093 6 -2


    MERCI
    .
    .
    Images attachées Images attachées  

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    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 847
    Points : 52 961
    Points
    52 961
    Billets dans le blog
    6
    Par défaut
    Dans une table il n'existe pas d'ordre des lignes. Si bien que les termes ligne d'avant ou ligne d'après n'ont aucun sens.

    Lisez ce que j'écris à ce sujet : http://blog.developpez.com/sqlpro/p5...sont-des-ense/

    Pour obtenir la valeur précédente dans l'ordre chronologique, vous devez donc faire une sous requête corrélée.

    Merci de respecter la charte de postage si vous voulez plus d'aide : http://www.developpez.net/forums/d96...vement-poster/

    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/ * * * * *

  3. #3
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 796
    Points
    4 796
    Par défaut
    Comme dit SQLpro,
    Il n'y a pas en natif dans SQL de moyen de "voir" la ligne "du dessus" (on n'est pas dans Excel ...).
    En effet, on ne raisonne qu'en ensemble de lignes non classées.
    (c'est valable pour toutes les bases de données).

    Pour résoudre ce problème, il y a aussi un moyen un peu bourin mais efficace
    qui consiste à faire un curseur ordonné sur ta table pour parcourir
    les données, les stocker dans des variables "au dessus" et "en dessous" pour
    les comparer.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    Il n'y a pas en natif dans SQL de moyen de "voir" la ligne "du dessus" (on n'est pas dans Excel ...).
    En SQL-Server ce n'est pas encore implémenté, mais les fonctions LAG et LEAD font bien parties de la norme SQL.

    La ligne du-dessus, sur une requête triée (c'est précisé par fabiofabio), ça a du sens !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    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 847
    Points : 52 961
    Points
    52 961
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Waldar Voir le message
    En SQL-Server ce n'est pas encore implémenté, mais les fonctions LAG et LEAD font bien parties de la norme SQL.
    oui, mais cela nécessite une cluse OVER d'ordonnancement. Donc le problème reste le même : pas d'ordre par défaut !

    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/ * * * * *

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 107
    Points : 57
    Points
    57
    Par défaut
    Bonjour et Merci pour vos réponses,

    Je suis un peu perdu pour savoir si on peut résoudre le problème en langage SQL ou pas ???

    Que pensez-vous de cette approche suivante :
    Est-il possible de créer une clé primaire de type ID sur une table temporaire ?

    Si oui, pourriez-vous m'indiquer: Comment on ajoute d'une clé primaire sur une table temporaire ?

    Merci et encore merci

  7. #7
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 796
    Points
    4 796
    Par défaut
    En supposant que le champ clé primaire de la table temporaire #MaTable est MonChamp, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE #MaTable ADD CONSTRAINT MonChamp_PK PRIMARY KEY
    Mais cela ne suffira pas à résoudre ton problème dans l'immédiat.
    Tu devras compléter par une requête assez sophistiquée ou une procédure stockée.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 107
    Points : 57
    Points
    57
    Par défaut
    En supposant que le champ clé primaire de la table temporaire #MaTable est MonChamp, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE #MaTable ADD CONSTRAINT MonChamp_PK PRIMARY KEY
    Heu...j'utilise SQL Server 2005 et la requête ne fonctionne pas. j'ai l'erreur suivante:
    Msg 170, Level 15, State 1, Line 49
    Line 49: Incorrect syntax near '@temp5'.

    Etes-vous sur que ça fonctionne avec des tables temporaires?

  9. #9
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 796
    Points
    4 796
    Par défaut
    Oubli de préciser le champ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE #MaTable ADD CONSTRAINT MonChamp_PK PRIMARY KEY (MonChamp)
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 107
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    une fonction simple avec ALTER TABLE ne semble pas fonctionner avec les tables temporaires ... ?

    ...

  11. #11
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 796
    Points
    4 796
    Par défaut Mais si, mais si ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE #MaTable (mon_champ_cle int NOT NULL, mon_autre_champ varchar(50))
     
    ALTER TABLE #MaTable ADD CONSTRAINT MonChamp_PK PRIMARY KEY (mon_champ_cle)
     
    INSERT INTO #MaTable VALUES (1, 'Kobold')
    INSERT INTO #MaTable VALUES (2, 'Klabautermann')
    INSERT INTO #MaTable VALUES (3, 'è pericoloso sporgersi')
     
    SELECT * FROM #MaTable
    Ce qui donne comme résultat :
    mon_champ_cle mon_autre_champ
    ------------- --------------------------------------------------
    1 Kobold
    2 Klabautermann
    3 è pericoloso sporgersi
    Ensuite on ajoute un doublon pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO #MaTable VALUES (2, 'raté pour sûr ...')
    et donc :
    Serveur*: Msg 2627, Niveau 14, État 1, Ligne ...
    Violation de la contrainte PRIMARY KEY 'MonChamp_PK'. Impossible d'insérer une clé en double dans l'objet '#MaTable ....
    L'instruction a été arrêtée.
    Mais on est complètement en dehors de la question initiale !
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    En remplacant la table "tTest" et les champs "id", "v1", "v2" par ce qu'il vous convienda, vous devriez obtenir le bon résultat.

    (Je suppose que votre clé "id" est indexée)

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    WITH Ordered AS (
    	select 
    		id
    		, v1
    		, v2
    		-- Si vos id sont consécutifs utilisez :
    		, id AS Row
                               /* Sinon utilisez :
                               , ROW_NUMBER() OVER (ORDER BY id ASC) AS Row
                               Mais ce sera beaucoups plus lent */
    	from tTest
    )
    , CTE AS (
    	select 
    		id
    		, v1
    		, v2
    		, Row
    		, 0 AS Done
    	from Ordered
    	UNION ALL
    	select
    		id
    		, Y.v1
    		, Y.v2
    		, Y.Row
    		, X.done
    	from CTE
    	cross apply (
    		SELECT case when v1 is not null and v2 is not null then 1 else 0 end
    	) as X(done)
    	CROSS APPLY (
    		SELECT
    			CTE.v1
    			, CTE.v2
    			, CTE.Row
    		WHERE X.done = 1
    		UNION ALL
    		SELECT
    			ISNULL(CTE.v1, O.v1)
    			, ISNULL(CTE.v2, O.v2)
    			, O.Row
    		FROM Ordered AS O
    		WHERE X.done = 0
    		AND	O.Row = CTE.Row - 1
    	) AS Y
    	where CTE.done = 0
    )
    SELECT 
    	id
    	, v1
    	, v2
    FROM CTE
    WHERE Done = 1
    ORDER BY id ASC
    Most Valued Pas mvp

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2010, 14h38
  2. Réponses: 3
    Dernier message: 28/07/2010, 17h26
  3. [MySQL] [MySQL] Avoir une valeur NULL plutôt que 0 (zéro) dans un champ
    Par Sparktacus dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/07/2010, 17h24
  4. Remplacer les valeurs NULL par d'autres valeurs
    Par salmer dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 22/11/2006, 15h20

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