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 13/04/2011, 14h26   #1
Nouveau Membre du Club
 
Homme Loïc Bernard
Consultant en Business Intelligence
Inscription : avril 2008
Messages : 44
Détails du profil
Informations personnelles :
Nom : Homme Loïc Bernard
Âge : 34
Localisation : Belgique

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 44
Points : 32
Points : 32
Par défaut [T-SQL] update avec incrémentation

Bonjour,
Je dois dans le cadre d'une extraction de données d'une base A à une base B faire une requete qui donnerait

tableA

Code :
1
2
3
4
5
6
7
8
9
10
11
 
item           Commande     Qty
------         --------------    --------- 
1                 1                   20
1                 1                   30
1                 2                   200
1                 2                   3
1                 2                   10
2                 17                 20
3                 22                 1000
3                 22                 2000
tableB

Code :
1
2
3
4
5
6
7
8
9
10
11
 
item           Commande     Qty          Num_Ligne
------         --------------    ---------     -------------
1                 1                   20              1
1                 1                   30              2
1                 2                   200            1
1                 2                   3                2
1                 2                   10              3
2                 17                 20              1
3                 22                 1000           1
3                 22                 2000           2
Une des idées que j'ai eu est
ETAPE 1
Code :
1
2
INSERT INTO TABLEB ( Item, Commande, Qty, Num_Ligne)
(SELECT Item, Commande, Qty, 0 FROM TABLEA )
ETAPE2

Code :
1
2
3
4
5
6
7
8
UPDATE TABLEB
SET Num_Ligne = B2.Num_Ligne
FROM TABLEB AS B1 INNER JOIN 
         (SELECT Item, Commande, (max(Num_Ligne) + 1) AS Num_Ligne
          FROM TABLEB
          GROUP BY Item, Commande) AS B2 
         ON  B1.Item=B2.Item AND B1.Commande=B2.Commande
WHERE Num_Ligne = 0
Ce qui donne
Code :
1
2
3
4
5
6
7
8
9
10
11
 
item           Commande     Qty          Num_Ligne
------         --------------    ---------     -------------
1                 1                   20              1
1                 1                   30              1
1                 2                   200            1
1                 2                   3                1
1                 2                   10              1
2                 17                 20              1
3                 22                 1000           1
3                 22                 2000           1
Bon je me doute bien pourquoi cette méthode ne marche pas mais je vois pas du tout comment faire pour que ca marche... mis à part peut etre une procedure stockée avec un curseur.

enfin je suis preneur de tout en 1, 2, 3 requetes s'il le faut
Merci d'avance

Loic
lbernard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 16h44   #2
Futur Membre du Club
 
Inscription : mars 2004
Messages : 13
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2004
Messages : 13
Points : 16
Points : 16
Envoyer un message via ICQ à Ch0n Envoyer un message via MSN à Ch0n
Code :
1
2
3
4
5
6
7
8
 
INSERT INTO TABLEB ( Item, Commande, Qty, Num_Ligne)
SELECT 
Item,
Commande,
Qty, 
DENSE_RANK() over (PARTITION BY Item, Commande)
FROM TABLEA
Es ce que c'est pas cela que tu voudrais par hasard

Ch0n est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 18h05   #3
Nouveau Membre du Club
 
Homme Loïc Bernard
Consultant en Business Intelligence
Inscription : avril 2008
Messages : 44
Détails du profil
Informations personnelles :
Nom : Homme Loïc Bernard
Âge : 34
Localisation : Belgique

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 44
Points : 32
Points : 32
Bonjour,
Merci de ton aide.
2 soucis ...
1. il faut un order by dans la clause Dense_RANK
ce qui donne pour le bete exemple
Code :
1
2
3
4
5
6
7
INSERT INTO TABLEB ( Item, Commande, Qty, Num_Ligne)
SELECT 
Item,
Commande,
Qty, 
DENSE_RANK() over (PARTITION BY Item, Commande ORDER BY Qty)
FROM TABLEA
2. Si tu as 2 quantités les même(dans l'exemple) elles vont avoir le meme numéro. ce qui est embetant dans ma vraie requete c'est que je n'ai à la base pas de champ dont je peux garantir qu'il sera toujours différent au sein d'un groupe (Item, Commande ). J'ai bien trouvé une solution mais je la trouve un peu(beaucoup) tordue. Il existe un RowID Global pour chaque table et donc je l'utilise dans l'order by

ce qui donne en vrai
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT Convert(Varchar(80),SOQ.SOHNUM_0) AS ORDER_IDEN,
       Convert(Varchar(80),DENSE_RANK() over (PARTITION BY SOQ.SOHNUM_0,ITMM.ITMREF_0 ORDER BY SOQ.ROWID))  AS ROW_IDEN,
       Convert(Varchar(80),ITMM.ITMREF_0 + '/DSV') AS PLANNING_ENTITY_IDEN,
       Convert(Varchar(80),'DEFAULT') AS MARKET_IDEN, 
       Convert(Varchar(80),'BO') AS ROW_CLASS_IDEN, 
       Convert(Varchar(255),'Back Order') AS ROW_CLASS_DESCRIPTION,
       SO.DEMDLVDAT_0 AS AGREED_PERIOD, 
       SO.DEMDLVDAT_0 AS REQUEST_PERIOD,
       SO.DEMDLVDAT_0 + 9999 AS CANCEL_PERIOD,
       SOQ.QTYSTU_0 - SOQ.ODLQTYSTU_0 - DLVQTYSTU_0 AS QUANTITY,
       0 AS STATUS,
       0 AS PRIORITY/* compteur*/,
       0 AS LAYER,
       -1 AS MAX_RESIDUAL,
       -1 AS MIN_RESIDUAL,
       Convert(Varchar(80),NULL) AS ROUTING_IDEN,
	   0 AS PLAN_RULE,
       NULL AS MAX_ANTICIPATION,
       1000000 AS CANCEL_COST
 
FROM  BCV5TEST.ITMMASTER AS ITMM INNER JOIN 
      BCV5TEST.SORDERQ   AS SOQ ON ITMM.ITMREF_0 = SOQ.ITMREF_0 INNER JOIN
      BCV5TEST.SORDER    AS SO  ON SO.SOHNUM_0 = SOQ.SOHNUM_0 
WHERE ITMM.XCATABC_0 <>4 AND
      SOQ.XQTYRESSTU_0 <> 0 AND
      SOQ.SOQSTA_0 <> 3
ORDER BY SOQ.SOHNUM_0,ITMM.ITMREF_0
Enfin ca a l'air de marcher

Juste par curiosité il y a t il d'autre moyen d'obtenir le meme résultat?

En tout cas encore merci de ton aide

Bonne soirée

Loïc
lbernard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 07h14   #4
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Juste par curiosité il y a t il d'autre moyen d'obtenir le meme résultat?
Oui mais le 8ème jour dieu inventa DENSE_RANK() pour éviter de continuer à faire autrement
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 08h45   #5
Nouveau Membre du Club
 
Homme Loïc Bernard
Consultant en Business Intelligence
Inscription : avril 2008
Messages : 44
Détails du profil
Informations personnelles :
Nom : Homme Loïc Bernard
Âge : 34
Localisation : Belgique

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 44
Points : 32
Points : 32
ok
bon ben adjugé et résolu
Merci à vous

Loïc
lbernard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 10h59   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par iberserk Voir le message
Oui mais le 8ème jour dieu inventa DENSE_RANK() pour éviter de continuer à faire autrement
...et le 9eme jour, il s'est dit que peut être lbernard n'aurait pas envie de faire un tri inutile sur son rowID et a donc inventé ROW_NUMBER(), qui a priori sera plus performant

Code SQL :
1
2
 
ROW_NUMBER() OVER (PARTITION BY Item, Commande ORDER BY Item)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 11h36   #7
Nouveau Membre du Club
 
Homme Loïc Bernard
Consultant en Business Intelligence
Inscription : avril 2008
Messages : 44
Détails du profil
Informations personnelles :
Nom : Homme Loïc Bernard
Âge : 34
Localisation : Belgique

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 44
Points : 32
Points : 32
et le 10ème jour LBERNARD fier de son oeuvre se reposa
Trève de plaisanterie c'est ca que je voulais exactement comme alternative j'aimais pas l'idée du ROWID

c'est testé, adjugé, vendu
Merci beaucoup
lbernard 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 02h28.


 
 
 
 
Partenaires

Hébergement Web