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

MS SQL Server Discussion :

Combler les valeurs NULL


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2003
    Messages : 24
    Par défaut Combler les valeurs NULL
    Bonjour à tous,

    Le contexte :
    Je suis en train de reprendre une appli de rdv pour un centre de controle technique, il me faut conserver l'historique des rdv et ajouter certaines fonctionnalités à l'appli actuelle, seulement certaines de ces nouvelles fonctionnalités m'obligent à transformer une partie des données de la BDD


    La problèmatique :
    Un dessin valant mieux qu'un long discours, je vous présente un schéma (simplifié) de ma table RDV

    TABLE RDV
    ID_RDV----ID_CRENEAU--------NUMLIGNE
    1--------------1-------------------3
    2--------------1-----------------NULL
    3--------------1-----------------NULL
    4--------------2-------------------1
    6--------------2-------------------2
    7--------------3-----------------NULL
    10-------------4-----------------NULL
    22-------------4-----------------NULL
    - Les 3 champs sont des integer
    - ID_RDV est la clé primaire IDENTITY(1,1)
    - Le champ ID_CRENEAU est une clé étrangère faisant référence à une table CRENEAU;
    - NUMLIGNE permet de positionner le rdv sur l'agenda; si on prend l'exemple du ID_CRENEAU 1, on voit que le numligne ne peut pas dépasser 3 c'est le cas avec le RDV 1, les RDV 2 et 3 étant placé par l'appli actuelle là ou il y a des trous dans le planning.

    TABLE CRENEAU
    ID_CRENEAU------------DATE----------HEURE_DEB-----------NB_LIGNE
    1---------------------11/07/2013--------08:00----------------3
    2---------------------11/07/2013--------08:30----------------3
    3---------------------11/07/2013--------09:00----------------4
    4---------------------11/07/2013--------10:00----------------4
    - NB_LIGNE est le nombre maximal de RDV pour chaque créneau


    Ma problématique vient de ce fameu champ NUMLIGNE de ma table RDV. J'ai besoin que TOUT les NUMLIGNE soit remplit mais sans modifier les NUMLIGNE déjà attribué.

    Pour l'exemple, une fois que j'aurais réussi (ou plutôt que vous m'aurait bien orienté parce que là je galère :-) ) que ma table RDV ressemble à ça :

    TABLE RDV
    ID_RDV----ID_CRENEAU--------NUMLIGNE
    1--------------1-------------------3
    2--------------1-------------------1
    3--------------1-------------------2
    4--------------2-------------------1
    6--------------2-------------------2
    7--------------3-------------------1
    10-------------4-------------------1
    22-------------4-------------------1


    J'ai bien réussit à trouver un mo yen de combler ces trous, mais de manière pas assez performante;
    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
     
    DECLARE @NUMLIGNE INT;
    DECLARE @ID_RDV INT;
    DECLARE @ID_CRENEAU INT;
     
    WHILE EXISTS(SELECT TOP 1 * FROM RDV WHERE NUMLIGNE IS NULL )
    BEGIN 
    	SELECT TOP 1 @ID_CRENEAU = ID_CRENEAU, @ID_RDV = ID_RDV FROM RDV WHERE NUMLIGNE IS NULL ORDER BY ID_CRENEAU
    	SET @NUMLIGNE = (SELECT TOP 1 * 
    					FROM (	SELECT I 
    							FROM	dbo.FN_GET_SERIE (1, 10) S
    							WHERE	NOT EXISTS (SELECT	ISNULL(NUMLIGNE,0) 
    												FROM	RDV R2 
    												WHERE	R2.ID_CRENEAU =@ID_CRENEAU AND 
    														S.I=R2.NUMLIGNE)
    						) OQP
    					ORDER BY OQP.I
    				)
    	UPDATE RDV SET NUMLIGNE= @NUMLIGNE WHERE ID_RDV =@ID_RDV ;
    END
    plus de 20 minutes pour mettre à jour 3000 lignes sur 3 000 000 au total, ça va me prendre des heures !!

    Donc si quelqu'un à une idée plus performante à me soumettre, je suis preneur.

    Merci d'avance !!

  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 997
    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 997
    Billets dans le blog
    6
    Par défaut
    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 RDV
    (ID_RDV       INT,
     ID_CRENEAU   INT,
     NUMLIGNE     INT);
     
    INSERT INTO RDV VALUES
    (1, 1, 3),
    (2, 1, NULL),
    (3, 1, NULL),
    (4, 2, 1),
    (6, 2, 2),
    (7, 3, NULL),
    (10, 4, NULL),
    (22, 4, NULL);
    la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID_RDV, ID_CRENEAU, 
           COALESCE(NUMLIGNE, ROW_NUMBER() OVER(PARTITION BY ID_CRENEAU ORDER BY ID_RDV DESC)) AS NUMLIGNE
    FROM   RDV
    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
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2003
    Messages : 24
    Par défaut
    Ca parait tellement simple quand on voit la réponse.

    Merci beaucoup SQLPro

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2003
    Messages : 24
    Par défaut
    Arghhhhhhhhhh

    ça marche ... presque

    J'ai dans ma table des cas plus tordus que ceux que j'ai présenté.

    Exemple
    ID_RDV----ID_CRENEAU--------NUMLIGNE
    100--------------11----------------3
    208--------------11----------------1
    312--------------11---------------NULL
    148--------------17---------------NULL
    168--------------19----------------2
    197--------------17----------------1
    226--------------17----------------3
    268--------------19---------------NULL
    362--------------19----------------4

    Ou là malheureusement, en appliquant ta solution, je me retrouve avec :
    2 NUMLIGNE 1 pour ID_CRENEAU 11
    2 NUMLIGNE 3 pour ID_CRENEAU 17
    2 NUMLIGNE 2 pour ID_CRENEAU 19

  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 997
    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 997
    Billets dans le blog
    6
    Par défaut
    Quelle est la règle logique de numérotation ??????

    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 averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2003
    Messages : 24
    Par défaut
    Si la question concerne le champ NUMLIGNe, malheureusement, il n'y a pas de logique.

    Je m'explique, un contrôleur prends un client par téléphone qui souhaite poser un RDV pour le 15/ juillet à 8h00, les 3 créneaux sont disponibles et le controleur décide pour une raison que j'ignore de placer ce RDV en Ligne 2.

    Un autre client souhaite prendre aussi un RDV pour le 15 juillet à 8h00, mais lui il passe par le site internet, au moment de la validation de son RDV dans la table il aura un NUMLIGNE NULL.

    C'est absolument débile, enfin moi je trouve, mais j'ai pas le choix, je dois faire avec.

Discussions similaires

  1. J’ai un souci avec les valeurs null sous sql server.
    Par zoltix dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/06/2006, 10h27
  2. Les jointures... et les valeurs nulles !
    Par PJ_56 dans le forum SQL
    Réponses: 2
    Dernier message: 25/04/2006, 23h33
  3. [Excel] Ne pas tracer les valeurs nulles d'un graphe
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/02/2006, 19h00
  4. order by sans les valeurs NULL
    Par pendragon509 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/10/2005, 12h31
  5. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h02

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