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 :

Comment faire la soustraction [DATE]


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Par défaut Comment faire la soustraction [DATE]
    bonjour tous le monde,
    voila mon problème, je veux faire la soustraction de la somme d'index marqué sur le compteur X le jour J avec le jour d'avant J-1, faut que je calcule l'index de ( J-1 - J ) ce qui va me donné le volume du compteur du jour J, je sais pas si j'ai bien transmis le probleme ou pas, -_- Merci de m'aider

    tables:
    Compteur(cp_num,#rcp_num)
    ReleverCompteur(rcp_num,index,volume,DateRelever)

  2. #2
    Membre expérimenté
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Par défaut
    Pouvez vous nous donner un exemple?

  3. #3
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Par défaut
    Citation Envoyé par jero44 Voir le message
    Pouvez vous nous donner un exemple?


    Donc je vais inséré un nouveau relever de compteur avec l'index2 mais pour calculé le volume du compteur aujourd'hui même faut que je calcul l'index d'hier moin l'index d'aujourd'hui, index1= 1233 index2= 3449, donc pour savoir ce que le client a consommé faut faire (index1-index2) ce qui va nous donné le volume du compteur, je vais ajouté volume dans la table RCAdduction.
    Donc la saisie de nouveau relevé c'est entré le numéro le type.. et l'index d'aujourd'hui mais dans l'insertion de cet ligne je veux une fonction qui calcul et me renvoi le volume et l'enregistré de suite.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Il vous faut pour cela réaliser une auto-jointure sur la table.
    Vous pourriez également écrire une fonction qui vous servirait à créer une colonne calculée automatiquement.

    Soit votre nouvelle colonne RCA_consomation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE RCAdduction
    ADD RCA_consomation INT
    Voici comment la mettre à jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE		dbo.RCAdduction
    SET		RCA_consommation = A.idx - H.idx
    FROM		dbo.RCAdduction AS H
    INNER JOIN	dbo.RCAdduction AS A
    			ON A.num = H.num
    			AND DATEADD(day, -1, A.RCA_date) = H.RCA_date
    Vous noterez néanmoins que le prédicat de jointure n'est pas SARGable, puisqu'il utilise une fonction.

    Voici comment créer la colonne calculée.
    Vous devez d'abord créer la fonction qui vous retournera la consommation :

    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
    CREATE FUNCTION FnGet_RCA_consommation
    	(
    		@_num INT
    		, @_RCA_date DATE
    	)
    	RETURNS INT
    	WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN
    	(
    		SELECT		A.idx - H.idx
    		FROM		dbo.RCAdduction AS H
    		INNER JOIN	dbo.RCAdduction AS A
    					ON A.num = H.num
    					AND DATEADD(day, -1, A.RCA_date) = H.RCA_date
    		WHERE		A.RCA_date = @_RCA_date
    	)
    END
    Et la colonne calculée devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE RCAdduction
    ADD RCA_consomation AS (dbo.FnGet_RCA_consommation(RCA_num, RCA_Date) PERSISTED
    N'utilisez le mot clé PERSISTED que si vous souhaitez physiquement stocker le résultat de la fonction, et éventuellement l'indexer pour rechercher, par exemple, les clients qui auraient fait une consommation élevée la veille

    Vous pouvez également prendre en paramètre de la fonction seulement la valeur de clé primaire, mais de par votre modèle, je ne suis pas certain que ce soit possible.

    Une dernière possibilité est de créer une vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE VIEW V_RCA_consommation
    AS
    SELECT		A.PK
    		, A.idx - H.idx AS RCA_consommation
    FROM		dbo.RCAdduction AS H
    INNER JOIN	dbo.RCAdduction AS A
    			ON A.num = H.num
    			AND DATEADD(day, -1, A.RCA_date) = H.RCA_date
    Il ne vous reste alors qu'a joindre la vue et votre table sur la clé primaire pour obtenir la consommation.

    A vous de choisir

    @++

  5. #5
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Par défaut
    Merci pour ta réponse, pour la modification de la colonne RCA_Consommation il m'affiche l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 8154, Level 16, State 1, Line 1
    La table 'RCAdduction' est ambiguë.
    UPDATE RCAdduction
    SET RCA_consommation = A.RCA_INDEX - H.RCA_INDEX
    FROM dbo.RCAdduction AS H
    INNER JOIN dbo.RCAdduction AS A
    ON A.RCA_Num = H.RCA_Num
    AND DATEADD (day, -1, A.RCA_date) = H.RCA_date
    -----------------------
    Pour la function ca me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Msg 2715, Level 16, State 3, Procedure FnGet_RCA_consommation, Line 1
    Colonne, paramètre ou variable #2*: type de données Date introuvable.
    Le paramètre ou la variable '@_RCA_date' a un type de données non valide.
    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
    CREATE FUNCTION FnGet_RCA_consommation
    	(
    		@_RCA_num INT
    		, @_RCA_date Date
    	)
    	RETURNS INT
    	WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN
    	(
    		SELECT		A.RCA_index - H.RCA_index
    		FROM		dbo.RCAdduction AS H
    		INNER JOIN	dbo.RCAdduction AS A
    					ON A.RCA_num = H.RCA_num
    					AND DATEADD(day, -1, A.RCA_date) = H.RCA_date
    		WHERE		A.RCA_date = @_RCA_date
    	)
    END
    Cordialement,

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Le paramètre ou la variable '@_RCA_date' a un type de données non valide.
    Donc c'est que vous n'exécutez pas la version 2008 de SQL Server.
    Quelle version avez-vous donc ?
    Quel est le type de données de la colonne RCA_Date ?
    Même question pour RCA_Heure.

    @++

Discussions similaires

  1. comment faire une soustraction en c#.. ?
    Par jmclej dans le forum C#
    Réponses: 1
    Dernier message: 16/06/2015, 16h42
  2. Comment faire un order by date après un DATE_FORMAT
    Par lodan dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/04/2007, 15h53
  3. comment faire une verification sur une date
    Par alexF dans le forum Delphi
    Réponses: 11
    Dernier message: 10/01/2007, 15h12
  4. [XSLT] Tri de date par mois : comment faire ?
    Par sdkddk dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 04/08/2006, 21h37
  5. comment faire pour avoir Date JJ/MM/YYYY
    Par zaoueche dans le forum Débuter
    Réponses: 2
    Dernier message: 27/10/2005, 09h59

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