2010-09-02 7 views
2

J'ai deux tables temporaires, toutes deux remplies par des requêtes TSQL.TSQL Boucle dans les enregistrements de table et comparaison avec la deuxième table

Temp Table A contenant un emplacement, un élément et un inventaire total.

Température ambiante B contenant un emplacement, un article, un numéro de commande client et un nombre d'inventaire négatif.

Je voudrais parcourir chaque élément dans Tableau B et soustraire le nombre d'inventaire négatif du tableau A où l'emplacement et l'élément correspondent. Une fois que l'inventaire atteint < = 0 dans le tableau B, je veux générer chaque commande dans une troisième table qui contient l'emplacement, l'article et le numéro de commande client.

EXEMPLE TABLEAU A

Item|Location|Inventory 
1 A  10 
2 B  20 

EXEMPLE TABLEAU B

Order|Item|Location|QuanityUsed 
ABC |1 |A  |5 
ZYX |2 |B  |10 
DEF |1 |A  |6 

DEF serait en sortie TABLEAU C parce qu'il inventaire ne suffit pas pour remplir la commande après soustraction ABC de commande.

Comment puis-je accomplir ceci?

+0

Dans quel ordre parcourriez-vous la table B? – Andomar

+0

Dans l'ordre de la première colonne, l'ID de la commande –

Répondre

2

Vous pouvez utiliser aubquery pour calculer un total cumulé. Dans la requête externe, vous pouvez spécifier que le total de fonctionnement doit être supérieure à l'inventaire total:

select location 
,  item 
,  [Order] 
,  TotalInventory 
,  RunningTotal 
from (
     select [order].location 
     ,  [order].item 
     ,  [order].[Order] 
     ,  (
       select SUM(inventory) 
       from @a inv 
       where inv.item = [order].item 
         and inv.location = [order].location 
       ) as TotalInventory 
     ,  (
       select SUM(QuantityUsed) 
       from @b prevorder 
       where prevorder.item = [order].item 
         and prevorder.location = [order].location 
         and prevorder.[order] <= [order].[order] 
       ) as RunningTotal 
     from @b [order] 
     ) as OrderExtended 
where TotalInventory < RunningTotal 

données de test:

declare @a table (item int, location char(1), inventory int) 
insert into @a select 1, 'A', 10 
union all select 2, 'B', 20 
declare @b table ([order] char(3), item int, location char(1), QuantityUsed int) 
insert into @b select 'ABC', 1, 'A', 5 
union all select 'ZYX', 2, 'B', 10 
union all select 'DEF', 1, 'A', 6 

Cette impression:

location item Order TotalInventory RunningTotal 
A   1  DEF 10    11 

Commandez DEF fait que l'emplacement A dépasse son inventaire de l'article 1 par 10 - 11 = 1.

Questions connexes