Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/06/2011, 10h05   #1
Futur Membre du Club
 
Homme Stéphane Bouvet
Chef de projet MOA
Inscription : mai 2011
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Bouvet
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : mai 2011
Messages : 40
Points : 15
Points : 15
Par défaut Problème Syntaxe UPDATE

Bonjour,

J'ai un petit problème syntaxique avec la requête suivante :

Code :
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 :
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
darKStein est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h18   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
Démarrez omme ceci :

Code :
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h40   #3
Futur Membre du Club
 
Homme Stéphane Bouvet
Chef de projet MOA
Inscription : mai 2011
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Bouvet
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : mai 2011
Messages : 40
Points : 15
Points : 15
Vous préconisez le COALESCE au lieu du ISNULL ?

Merci pour cette belle syntaxe !
darKStein est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h48   #4
Futur Membre du Club
 
Homme Stéphane Bouvet
Chef de projet MOA
Inscription : mai 2011
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Bouvet
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : mai 2011
Messages : 40
Points : 15
Points : 15
Citation:
Envoyé par SQLpro Voir le message
Démarrez omme ceci :

Code :
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
darKStein est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 11h04   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 11h13   #6
Futur Membre du Club
 
Homme Stéphane Bouvet
Chef de projet MOA
Inscription : mai 2011
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Bouvet
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : mai 2011
Messages : 40
Points : 15
Points : 15
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 :
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
darKStein est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 13h46   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h46.


 
 
 
 
Partenaires

Hébergement Web