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 :

Problème Syntaxe UPDATE


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Par défaut Problème Syntaxe UPDATE
    Bonjour,

    J'ai un petit problème syntaxique avec 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
     
    UPDATE	T_RUPTURE
    SET	PERTE_CA = ISNULL(CA, 0), PERTE_MARGE = ISNULL(MARGE, 0),
    	DD_CALC = GETDATE()
    FROM	(SELECT	SUM(CA_HT) AS CA, 
    		SUM(CA_HT - ACHAT_HT) AS MARGE
    	FROM	T_CA_HT
    	WHERE	T_CA_HT.REFERENCE = T_RUPTURE.REFERENCE
    		AND T_CA_HT.LIEU = T_RUPTURE.LIEU
    		AND DATE_VENTE >= DATEADD(day, -365, DATE_DEBUT_RUPTURE) 
    		AND DATE_VENTE < DATEADD(day, -365, ISNULL(DATE_FIN_RUPTURE, GETDATE())) ca
    WHERE	(PERTE_CA IS NULL OR DATE_FIN_RUPTURE IS NULL OR DATE_FIN_RUPTURE >= DATEADD(day, -2, GETDATE()))
    En effet SQL Server 2000 m'indique "T_RUPTURE.REFERENCE does not match with a table name or alias name used in the query".

    Il me faudrait donc écrire plus justement :
    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
     
    UPDATE	T_RUPTURE
    SET	PERTE_CA = ISNULL(CA, 0), PERTE_MARGE = ISNULL(MARGE, 0),
    	DD_CALC = GETDATE()
    FROM	(SELECT	REFERENCE, LIEU, DATE_VENTE, SUM(CA_HT) AS CA, 
    		SUM(CA_HT - ACHAT_HT) AS MARGE
    	FROM	T_CA_HT
    	WHERE	T_CA_HT.REFERENCE = T_RUPTURE.REFERENCE
    		AND T_CA_HT.LIEU = T_RUPTURE.LIEU
    	GROUP	BY REFERENCE, LIEU, DATE_VENTE) ca
    WHERE	(PERTE_CA IS NULL OR DATE_FIN_RUPTURE IS NULL OR DATE_FIN_RUPTURE >= DATEADD(day, -2, GETDATE()))
    	AND ca.LIEU = T_RUPTURE.LIEU
    	AND ca.REFERENCE = T_RUPTURE.REFERENCE
    	AND DATE_VENTE >= DATEADD(day, -365, DATE_DEBUT_RUPTURE) 
    	AND DATE_VENTE < DATEADD(day, -365, ISNULL(DATE_FIN_RUPTURE, GETDATE())
    Mais pour le coup je groupe mes ventes par date, ce qui me gêne, d'autant que je ramène pour le coup plus d'informations que ce dont j'ai réellement besoin. Y a-t-il un autre moyen ?

    Structures :
    T_RUPTURE :
    REFERENCE
    LIEU
    DATE_DEBUT_RUPTURE
    DATE_FIN_RUPTURE
    PERTE_CA
    PERTE_MARGE

    T_CA_HT :
    LIEU
    REFERENCE
    DATE_VENTE
    QTE_VENDUE
    CA_HT
    ACHAT_HT
    VENTE_HT

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Démarrez omme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE	T
    SET	PERTE_CA    = COALESCE(SUM(CA_HT), 0), 
        PERTE_MARGE = COALESCE(SUM(CA_HT - ACHAT_HT), 0),
    	DD_CALC     = GETDATE()
    FROM    T_CA_HT
            INNER JOIN T_RUPTURE AS T
                  ON T_CA_HT.REFERENCE = T.REFERENCE
                     AND T_CA_HT.LIEU = T.LIEU
    WHERE	DATE_VENTE >= DATEADD(day, -365, DATE_DEBUT_RUPTURE) 
      AND   DATE_VENTE < DATEADD(day, -365, COALESCE(DATE_FIN_RUPTURE, GETDATE())
    WHERE	PERTE_CA IS NULL OR 
            DATE_FIN_RUPTURE IS NULL OR
            DATE_FIN_RUPTURE >= DATEADD(day, -2, GETDATE())
    Il manque probablement encore un GROUP BY....

    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
    Chef de projet MOA
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Par défaut
    Vous préconisez le COALESCE au lieu du ISNULL ?

    Merci pour cette belle syntaxe !

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Démarrez omme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE	T
    SET	PERTE_CA    = COALESCE(SUM(CA_HT), 0), 
        PERTE_MARGE = COALESCE(SUM(CA_HT - ACHAT_HT), 0),
    	DD_CALC     = GETDATE()
    FROM    T_CA_HT
            INNER JOIN T_RUPTURE AS T
                  ON T_CA_HT.REFERENCE = T.REFERENCE
                     AND T_CA_HT.LIEU = T.LIEU
    WHERE	DATE_VENTE >= DATEADD(day, -365, DATE_DEBUT_RUPTURE) 
      AND   DATE_VENTE < DATEADD(day, -365, COALESCE(DATE_FIN_RUPTURE, GETDATE())
    WHERE	PERTE_CA IS NULL OR 
            DATE_FIN_RUPTURE IS NULL OR
            DATE_FIN_RUPTURE >= DATEADD(day, -2, GETDATE())
    Il manque probablement encore un GROUP BY....

    A +
    "An aggregate may not appear in the set list of an UPDATE statement". En outre nous avons 2 WHERE pour le prix d'un

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Exact sur le WHERE... Erreur de copier coller.

    Mais pour le reste, merci de respecter la charte de postage :
    http://www.developpez.net/forums/d96...vement-poster/
    Notamment :
    1) script DDL de vos tables
    2) jeu d'essais sous forme de INSERT

    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
    Chef de projet MOA
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Par défaut
    Désolé pour ce manque de respect de la charte !

    La beauté d'SQL : en utilisant cette requête update / select en remplacement d'un curseur (jy prends goût ), je passe d'1h30 de traitement à ... 50s pour 300 000 enr.

    Merci !
    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
     
    UPDATE	T_RUPTURE
    SET	PERTE_CA = ISNULL(CA_HT_N1, 0), 
    	PERTE_MARGE = ISNULL(MARGE_HT_N1, 0),
    	DD_CALC = GETDATE()
    FROM	(SELECT T_CA_HT.REFERENCE,
    		CC_LIEU,
    		SUM(MF_CA_HT) AS CA_HT_N1, 
    		SUM(MF_CA_HT - (MF_ACHAT_HT * (1 + QF_TX_REFACT / 100))) AS MARGE_HT_N1
    	FROM	T_CA_HT
    		INNER JOIN T_RUPTURE
    		ON T_CA_HT.REFERENCE = T_RUPTURE.REFERENCE
    			AND L_PARAM_DIVERS = CC_LIEU
    	WHERE	(PERTE_CA IS NULL OR DATE_FIN_RUPTURE IS NULL OR DATE_FIN_RUPTURE >= DATEADD(day, -2, GETDATE()))
    		AND DATE_VENTE >= DATEADD(day, -365, DATE_DEBUT_RUPTURE) 
    		AND DATE_VENTE < DATEADD(day, -365, ISNULL(DATE_FIN_RUPTURE, GETDATE()))
    	GROUP	BY T_CA_HT.REFERENCE,
    		CC_LIEU) ca
    WHERE	ca.REFERENCE = T_RUPTURE.REFERENCE
    	AND ca.CC_LIEU = T_RUPTURE.CC_LIEU

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Normal, les traitement à base de curseur sont itératifs parce que ligne à ligne.
    En passant par une requête vous faites travailler l'optimiseur qui va simplifier votre requête et faire des impasses.
    par exemple pourquoi recalculer 100 fois la même choses si les conditions d'entrée sont identiques.... Et ceci par le fait des lectures dans les index !

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de syntaxe update
    Par cameleon8010 dans le forum SQL
    Réponses: 2
    Dernier message: 07/02/2011, 17h55
  2. [MySQL] Problème syntaxe requete MySQL UPDATE
    Par flo73 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/07/2010, 07h41
  3. [MySQL] Problème syntaxe requete UPDATE
    Par stefsas dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/02/2010, 20h00
  4. Problème de UPDATE avec (probablement syntaxe)
    Par inc002 dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/07/2007, 11h27
  5. [ORACLE] problème de syntaxe UPDATE
    Par magic charly dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/05/2006, 12h26

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