Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Rêquete d'insertion SQL Server 2005

17 réponses
Avatar
EmanuelL
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non
auto-incrémentiel:'(, j'aimerai insérer les budgets 2010 qui sont les
mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois
récupérer le dernier enregistrement (MAX(Budget_Id), par exemple) et
pouvoir l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)

--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org

7 réponses

1 2
Avatar
EmanuelL
Merci encore Med, je teste demain.

A+ ;-)

Med Bouchenafa avait énoncé :
DECLARE @Decalage INT
SELECT @Decalage= MAX(Budget_Id ) FROM Budget

SELECT Budget_Id=IDENTITY(INT, 1, 1), Client_Id=Client_Id,
Designation='Budget 2010', Annee 10, Montant=Montant
INTO #Budget
FROM Budget

INSERT INTO Budget
SELECT Budget_Id = @Decalage + Budget_Id, Client_Id, Designation, Annee,
Montant FROM #Budget


Bien cordialement
Med Bouchenafa


"EmanuelL" wrote in message
news:
Merci Med,

J'ai adapté ma rêquete par rapport à ta solution.

Mais, je voulais que le 1805 soit dans une variable pour automatiser le
traitement: "SELECT Budget_Id=IDENTITY(INT, @Decalage, 1)". :/

A+ ;-)

Med Bouchenafa avait écrit le 25.11.2009 :
Tu calcules la prochaine valeur par un MAX et tu passes par une table
temporaire

SELECT Budget_Id=IDENTITY(INT, 1805, 1), Client_Id=Client_Id,
Designation='Budget 2010', Annee 10, Montant=Montant
INTO #Budget
FROM Budget

INSERT INTO Budget SELECT * FROM #Budget

Bien cordialement
Med Bouchenafa

"EmanuelL" wrote in message
news:
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non
auto-incrémentiel:'(, j'aimerai insérer les budgets 2010 qui sont les
mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois
récupérer le dernier enregistrement (MAX(Budget_Id), par exemple) et
pouvoir l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)

--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org







--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org







--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
Michel__D
Re,

EmanuelL a écrit :
Génial, merci encore Patrice.

SET @Decalage = (@Max - @Min + 1) + @Min


Petite correction : SET @Decalage =(@Max - @Min + 1), car si Max = 1804
et Min = 9 alors 1804 - 9 + 1 = 1796. Si Budget_Id = 9 alors 1796 + 9 =
1805 tout en rajoutant ORDER BY Budget_Id dans SELECT.

Seul bémol; s'il y a de trous dus au suppression de lignes, ils seront
réportés aussi :-Z.



Voici une autre possibilitée :

INSERT INTO Budget ( Budget_Id, Client_Id, Designation, Annee, Montant )
SELECT T3.MaxId+Count(T2.Budget_Id), T1.Client_Id, 'Budget 2010', 2010, T1.Montant
FROM (Budget AS T1
INNER JOIN Budget AS T2
ON (T1.Budget_Id >= T2.Budget_Id) AND (T1.Annee = T2.Annee))
INNER JOIN (SELECT Max(Budget_Id) AS MaxId, Annee FROM Budget GROUP BY Annee) AS T3
ON T1.Annee = T3.Annee
WHERE T1.Annee = 2009 And T1.Montant Is Not Null
GROUP BY T3.MaxId, T1.Budget_Id, T1.Client_Id, T1.Designation, T1.Annee, T1.Montant;
Avatar
EmanuelL
Salut Michel__D,

J'ai pris un peu du temps pour mieux comprendre ta solution l-). Ell
est parfaite, je reste bouche B!

Merci beaucoup.
A+ ;-)

Michel__D avait soumis l'idée :
Re,

EmanuelL a écrit :
Génial, merci encore Patrice.

SET @Decalage = (@Max - @Min + 1) + @Min


Petite correction : SET @Decalage =(@Max - @Min + 1), car si Max = 1804 et
Min = 9 alors 1804 - 9 + 1 = 1796. Si Budget_Id = 9 alors 1796 + 9 = 1805
tout en rajoutant ORDER BY Budget_Id dans SELECT.

Seul bémol; s'il y a de trous dus au suppression de lignes, ils seront
réportés aussi :-Z.



Voici une autre possibilitée :

INSERT INTO Budget ( Budget_Id, Client_Id, Designation, Annee, Montant )
SELECT T3.MaxId+Count(T2.Budget_Id), T1.Client_Id, 'Budget 2010', 2010,
T1.Montant
FROM (Budget AS T1
INNER JOIN Budget AS T2
ON (T1.Budget_Id >= T2.Budget_Id) AND (T1.Annee = T2.Annee))
INNER JOIN (SELECT Max(Budget_Id) AS MaxId, Annee FROM Budget GROUP BY
Annee) AS T3
ON T1.Annee = T3.Annee
WHERE T1.Annee = 2009 And T1.Montant Is Not Null
GROUP BY T3.MaxId, T1.Budget_Id, T1.Client_Id, T1.Designation, T1.Annee,
T1.Montant;



--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
Michel__D
Bonjour,

EmanuelL a écrit :
Salut Michel__D,

J'ai pris un peu du temps pour mieux comprendre ta solution l-). Ell est
parfaite, je reste bouche B!

Merci beaucoup.
A+ ;-)



Pas de quoi, c'était juste pour éviter l'emploi d'une table temporaire.
Avatar
Fred BROUARD
Beaucoup plus simple avec les fonctions de fenêtrage comme ROW_NUMBER :

INSERT INTO Budget
(Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT MAX_ID + N, Client_Id, 'Budget 2010', 2010, Montant
FROM (SELECT Client_Id, 'Budget 2010', 2010, Montant,
ROW_NUMBER() OVER(Order by Budget_Id) AS N,
(SELECT MAX(Budget_Id) FROM Budget) AS MAX_ID
FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL) AS T

Pour tout savoir sur ce genre de fonction, lisez l'article que j'ai écrit :
http://sqlpro.developpez.com/article/olap-clause-window/

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************


EmanuelL a écrit :
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non
auto-incrémentiel:'(, j'aimerai insérer les budgets 2010 qui sont les
mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois
récupérer le dernier enregistrement (MAX(Budget_Id), par exemple) et
pouvoir l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)



Avatar
EmanuelL
Salut Fred,

Merci encore de l'intérêt que tu as apporté à ce sujet.
Une fois encore, je suis impréssioné de ta salution très instructive
(en tout cas pour moi), car je ne connaissais pas ROW_NUMBER et OVER.
:-X

A+ ;-)

Fred BROUARD avait prétendu :
Beaucoup plus simple avec les fonctions de fenêtrage comme ROW_NUMBER :

INSERT INTO Budget
(Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT MAX_ID + N, Client_Id, 'Budget 2010', 2010, Montant
FROM (SELECT Client_Id, 'Budget 2010', 2010, Montant,
ROW_NUMBER() OVER(Order by Budget_Id) AS N,
(SELECT MAX(Budget_Id) FROM Budget) AS MAX_ID
FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL) AS T

Pour tout savoir sur ce genre de fonction, lisez l'article que j'ai écrit :
http://sqlpro.developpez.com/article/olap-clause-window/

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************


EmanuelL a écrit :
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non auto-incrémentiel:'(,
j'aimerai insérer les budgets 2010 qui sont les mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois récupérer
le dernier enregistrement (MAX(Budget_Id), par exemple) et pouvoir
l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)






--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
Fred BROUARD
Rebonjour,

EmanuelL a écrit :
Salut Fred,

Merci encore de l'intérêt que tu as apporté à ce sujet.
Une fois encore, je suis impréssioné de ta salution très instructive (en
tout cas pour moi), car je ne connaissais pas ROW_NUMBER et OVER. :-X



cela a été introduit avec la version 2005 de SQL Server, donc c'est
assez nouveau, mais pas complet. Des améliorations sont attendues sur ce
point !

A +

A+ ;-)

Fred BROUARD avait prétendu :
Beaucoup plus simple avec les fonctions de fenêtrage comme ROW_NUMBER :

INSERT INTO Budget
(Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT MAX_ID + N, Client_Id, 'Budget 2010', 2010, Montant
FROM (SELECT Client_Id, 'Budget 2010', 2010, Montant,
ROW_NUMBER() OVER(Order by Budget_Id) AS N,
(SELECT MAX(Budget_Id) FROM Budget) AS MAX_ID
FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL) AS T

Pour tout savoir sur ce genre de fonction, lisez l'article que j'ai
écrit :
http://sqlpro.developpez.com/article/olap-clause-window/

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************


EmanuelL a écrit :
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non
auto-incrémentiel:'(, j'aimerai insérer les budgets 2010 qui sont les
mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois
récupérer le dernier enregistrement (MAX(Budget_Id), par exemple) et
pouvoir l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)










--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
1 2