J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:
J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:
J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:
J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
Bien vu Fred, j'avais essayé rapidement de voir comment solutionner ce
problème sans succès (comme quoi :-)) ! :-(
Entièrement d'accord avec toi sur le fait qu'il faut dans la mesure du
possible ne pas utiliser les curseurs sur des grosses volumétries. Par
contre, sur des requêtes ne nécessitant pas de traiter des gros volumes de
données, on peut y gagner en lisibilité.
Merci Fred pour ta solution mais par contre attention attention car elle ne
fonctionne pas si l'on a deux lignes ayant la même date de réception.
Ajoute par exemple : INSERT INTO reception VALUES (1, 1,
'01/01/2005', null) et le résultat deviens :
cde qte_recue date_reception
reste
----------- ----------- ------------------------------------------------------
-----------
1 1 2005-01-01 00:00:00.000
49
1 10 2005-01-01 00:00:00.000
40
1 20 2005-02-01 00:00:00.000
19
1 5 2005-02-15 00:00:00.000
14
2 50 2005-02-05 00:00:00.000
50
2 25 2005-02-08 00:00:00.000
25
3 20 2005-03-28 00:00:00.000
0
----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France
"Fred BROUARD" wrote in message
news:Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
Bien vu Fred, j'avais essayé rapidement de voir comment solutionner ce
problème sans succès (comme quoi :-)) ! :-(
Entièrement d'accord avec toi sur le fait qu'il faut dans la mesure du
possible ne pas utiliser les curseurs sur des grosses volumétries. Par
contre, sur des requêtes ne nécessitant pas de traiter des gros volumes de
données, on peut y gagner en lisibilité.
Merci Fred pour ta solution mais par contre attention attention car elle ne
fonctionne pas si l'on a deux lignes ayant la même date de réception.
Ajoute par exemple : INSERT INTO reception VALUES (1, 1,
'01/01/2005', null) et le résultat deviens :
cde qte_recue date_reception
reste
----------- ----------- ------------------------------------------------------
-----------
1 1 2005-01-01 00:00:00.000
49
1 10 2005-01-01 00:00:00.000
40
1 20 2005-02-01 00:00:00.000
19
1 5 2005-02-15 00:00:00.000
14
2 50 2005-02-05 00:00:00.000
50
2 25 2005-02-08 00:00:00.000
25
3 20 2005-03-28 00:00:00.000
0
----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France
"Fred BROUARD" <brouardf@club-internet.fr> wrote in message
news:42868491.7080407@club-internet.fr...
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:
J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
Bonjour,
Bien vu Fred, j'avais essayé rapidement de voir comment solutionner ce
problème sans succès (comme quoi :-)) ! :-(
Entièrement d'accord avec toi sur le fait qu'il faut dans la mesure du
possible ne pas utiliser les curseurs sur des grosses volumétries. Par
contre, sur des requêtes ne nécessitant pas de traiter des gros volumes de
données, on peut y gagner en lisibilité.
Merci Fred pour ta solution mais par contre attention attention car elle ne
fonctionne pas si l'on a deux lignes ayant la même date de réception.
Ajoute par exemple : INSERT INTO reception VALUES (1, 1,
'01/01/2005', null) et le résultat deviens :
cde qte_recue date_reception
reste
----------- ----------- ------------------------------------------------------
-----------
1 1 2005-01-01 00:00:00.000
49
1 10 2005-01-01 00:00:00.000
40
1 20 2005-02-01 00:00:00.000
19
1 5 2005-02-15 00:00:00.000
14
2 50 2005-02-05 00:00:00.000
50
2 25 2005-02-08 00:00:00.000
25
3 20 2005-03-28 00:00:00.000
0
----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France
"Fred BROUARD" wrote in message
news:Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin, par
exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
salut Philippe,
Philippe T [MS] a écrit:Bonjour,
Bien vu Fred, j'avais essayé rapidement de voir comment solutionner ce
problème sans succès (comme quoi :-)) ! :-(
Entièrement d'accord avec toi sur le fait qu'il faut dans la mesure du
possible ne pas utiliser les curseurs sur des grosses volumétries. Par
contre, sur des requêtes ne nécessitant pas de traiter des gros volumes
de données, on peut y gagner en lisibilité.
Merci Fred pour ta solution mais par contre attention attention car elle
ne fonctionne pas si l'on a deux lignes ayant la même date de réception.
C'est tout à fait correct et j'avais envisagé ce problème. On peut
d'ailleur y remédier, mais cela devient une requête très complexe (il faut
ajouter un coefficient diviseur et une énumération des lignes). Cependant,
dans un tel cas, cela signifierait que la base est mal modélisée et
difficile à exploiter.
Pour la petite histoire, essaye de supprimer dans une interface graphique
une des deux lignes de la table suivant :
CREATE TABLE T_TEST_DOUBLON (N INT)
INSERT INTO T_TEST_DOUBLON VALUES (1)
INSERT INTO T_TEST_DOUBLON VALUES (1)
Essaye par exemple dans EM en ouvrant la table, renvoyer toutes les lignes
de supprimer l'un des deux ligns (sans l'autre).
En conclusion, si de telles lignes existait dans le base de ce monsieur,
je ne me serais même pas penché sur son problème car une telle base serait
stupide !
A +Ajoute par exemple : INSERT INTO reception VALUES (1, 1,
'01/01/2005', null) et le résultat deviens :
cde qte_recue date_reception reste
----------- ----------- ------------------------------------------------------
-----------
1 1 2005-01-01 00:00:00.000 49
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 19
1 5 2005-02-15 00:00:00.000 14
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France
"Fred BROUARD" wrote in message
news:Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin,
par exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
salut Philippe,
Philippe T [MS] a écrit:
Bonjour,
Bien vu Fred, j'avais essayé rapidement de voir comment solutionner ce
problème sans succès (comme quoi :-)) ! :-(
Entièrement d'accord avec toi sur le fait qu'il faut dans la mesure du
possible ne pas utiliser les curseurs sur des grosses volumétries. Par
contre, sur des requêtes ne nécessitant pas de traiter des gros volumes
de données, on peut y gagner en lisibilité.
Merci Fred pour ta solution mais par contre attention attention car elle
ne fonctionne pas si l'on a deux lignes ayant la même date de réception.
C'est tout à fait correct et j'avais envisagé ce problème. On peut
d'ailleur y remédier, mais cela devient une requête très complexe (il faut
ajouter un coefficient diviseur et une énumération des lignes). Cependant,
dans un tel cas, cela signifierait que la base est mal modélisée et
difficile à exploiter.
Pour la petite histoire, essaye de supprimer dans une interface graphique
une des deux lignes de la table suivant :
CREATE TABLE T_TEST_DOUBLON (N INT)
INSERT INTO T_TEST_DOUBLON VALUES (1)
INSERT INTO T_TEST_DOUBLON VALUES (1)
Essaye par exemple dans EM en ouvrant la table, renvoyer toutes les lignes
de supprimer l'un des deux ligns (sans l'autre).
En conclusion, si de telles lignes existait dans le base de ce monsieur,
je ne me serais même pas penché sur son problème car une telle base serait
stupide !
A +
Ajoute par exemple : INSERT INTO reception VALUES (1, 1,
'01/01/2005', null) et le résultat deviens :
cde qte_recue date_reception reste
----------- ----------- ------------------------------------------------------
-----------
1 1 2005-01-01 00:00:00.000 49
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 19
1 5 2005-02-15 00:00:00.000 14
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France
"Fred BROUARD" <brouardf@club-internet.fr> wrote in message
news:42868491.7080407@club-internet.fr...
Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin,
par exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:
J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
salut Philippe,
Philippe T [MS] a écrit:Bonjour,
Bien vu Fred, j'avais essayé rapidement de voir comment solutionner ce
problème sans succès (comme quoi :-)) ! :-(
Entièrement d'accord avec toi sur le fait qu'il faut dans la mesure du
possible ne pas utiliser les curseurs sur des grosses volumétries. Par
contre, sur des requêtes ne nécessitant pas de traiter des gros volumes
de données, on peut y gagner en lisibilité.
Merci Fred pour ta solution mais par contre attention attention car elle
ne fonctionne pas si l'on a deux lignes ayant la même date de réception.
C'est tout à fait correct et j'avais envisagé ce problème. On peut
d'ailleur y remédier, mais cela devient une requête très complexe (il faut
ajouter un coefficient diviseur et une énumération des lignes). Cependant,
dans un tel cas, cela signifierait que la base est mal modélisée et
difficile à exploiter.
Pour la petite histoire, essaye de supprimer dans une interface graphique
une des deux lignes de la table suivant :
CREATE TABLE T_TEST_DOUBLON (N INT)
INSERT INTO T_TEST_DOUBLON VALUES (1)
INSERT INTO T_TEST_DOUBLON VALUES (1)
Essaye par exemple dans EM en ouvrant la table, renvoyer toutes les lignes
de supprimer l'un des deux ligns (sans l'autre).
En conclusion, si de telles lignes existait dans le base de ce monsieur,
je ne me serais même pas penché sur son problème car une telle base serait
stupide !
A +Ajoute par exemple : INSERT INTO reception VALUES (1, 1,
'01/01/2005', null) et le résultat deviens :
cde qte_recue date_reception reste
----------- ----------- ------------------------------------------------------
-----------
1 1 2005-01-01 00:00:00.000 49
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 19
1 5 2005-02-15 00:00:00.000 14
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France
"Fred BROUARD" wrote in message
news:Bonjour,
contrairement à certain qui t'invite à passer au curseur, cela est
parfaitement possible en une seule requête SQL :
démonstration :
SET DATEFORMAT DMY
CREATE TABLE reception
(cde int,
qte_recue int,
date_reception datetime,
reste int)
INSERT INTO reception VALUES (1, 10, '01/01/2005', null)
INSERT INTO reception VALUES (1, 20, '01/02/2005', null)
INSERT INTO reception VALUES (1, 5, '15/02/2005', null)
INSERT INTO reception VALUES (2, 50, '05/02/2005', null)
INSERT INTO reception VALUES (2, 25, '08/02/2005', null)
INSERT INTO reception VALUES (3, 20, '28/03/2005', null)
CREATE TABLE commande
(cde int,
qte int)
INSERT INTO commande VALUES (1, 50)
INSERT INTO commande VALUES (2, 100)
INSERT INTO commande VALUES (3, 20)
-- résultat souhaité :
/*
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
*/
SELECT cde, qte_recue, date_reception,
(SELECT c.qte - sum(qte_recue)
- COALESCE((SELECT sum(qte_recue)
FROM reception
WHERE date_reception < r.date_reception
AND cde = r.cde), 0)
FROM commande c
WHERE c.cde = r.cde
GROUP BY c.qte, c.cde ) reste
FROM reception r
GROUP BY cde, qte_recue, date_reception
ORDER BY cde, date_reception
cde qte_recue date_reception reste
----------- ----------- -------------------------- -------
1 10 2005-01-01 00:00:00.000 40
1 20 2005-02-01 00:00:00.000 20
1 5 2005-02-15 00:00:00.000 15
2 50 2005-02-05 00:00:00.000 50
2 25 2005-02-08 00:00:00.000 25
3 20 2005-03-28 00:00:00.000 0
A partir de cette requête SELECT tu peut mettre à jour ta table.
Sache que je donne des cours sur SQL...
je suis aussi l'auteur du site SQLpro, et des ouvrages SQL chez Campus
Press et PearsonEducation.
je donne aussi des cours sur SQL Server notamment d'optimisation afin,
par exemple, d'éviter que l'on utilise des curseurs là ou cela n'est pas
nécessaire...
A lire :
http://sqlpro.developpez.com
http://www.datasapiens.com/prestations/SQL_Server_2000_optimisation.pdf
A +
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
pat a écrit:J'ai les tables suivantes :
reception cde
cde qte_recue date reception reste cde qte
1 10 01/01/2005 1 50
1 20 01/02/2005 2 100
1 5 15/02/2005 3 20
2 50 05/02/2005
2 25 08/02/2005
3 20 28/03/2005
Les réceptions sont enregistrées au jour le jour dans la table.
Je voudrais mettre à jour le champ reste avec reste = cde.qte
-(somme(reception.qte_recue ou reception.cde = cde.cde)à chaque
enregistrement d'une réception.
Ce qui donnerait :
reception
cde qte_recue reste
1 10 40
1 20 20
1 5 15
2 50 50
2 25 25
3 20 0
J'ai essayé plusieurs syntaxe d'update avec une sous-requete sum sans
résultat.
Merci d'avance pour vos lumiéres
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Merci pour cette solution qui me renvoie effectivement le reste
calculé dont j'ai besoin.
Dans la base, le cas de 2 receptions pourun m^me article surune m^me
commande à la même
date est effectivement impossible.
Encore besoin d'un coup de pouce si possible
Si je mets le select avec seulement le champ reste en retour dans un
update
update reception set reste = (select(...), j'ai le message : la
sous-requete retourne plus d' un enregistrement.
Je pense m'en sortir en faisant un insert into du select dans une table
temporaire puis en faisant l'update à partir de la table tempo en
joignant sur la clé.
Pouvez-vous m'aiguiller ?
Merci pour cette solution qui me renvoie effectivement le reste
calculé dont j'ai besoin.
Dans la base, le cas de 2 receptions pourun m^me article surune m^me
commande à la même
date est effectivement impossible.
Encore besoin d'un coup de pouce si possible
Si je mets le select avec seulement le champ reste en retour dans un
update
update reception set reste = (select(...), j'ai le message : la
sous-requete retourne plus d' un enregistrement.
Je pense m'en sortir en faisant un insert into du select dans une table
temporaire puis en faisant l'update à partir de la table tempo en
joignant sur la clé.
Pouvez-vous m'aiguiller ?
Merci pour cette solution qui me renvoie effectivement le reste
calculé dont j'ai besoin.
Dans la base, le cas de 2 receptions pourun m^me article surune m^me
commande à la même
date est effectivement impossible.
Encore besoin d'un coup de pouce si possible
Si je mets le select avec seulement le champ reste en retour dans un
update
update reception set reste = (select(...), j'ai le message : la
sous-requete retourne plus d' un enregistrement.
Je pense m'en sortir en faisant un insert into du select dans une table
temporaire puis en faisant l'update à partir de la table tempo en
joignant sur la clé.
Pouvez-vous m'aiguiller ?