2012-06-07 1 views
1

J'ai un ensemble de données qui énumère la date et la quantité de stock futur de produits. Parfois, notre demande dépasse notre offre future et nous nous retrouvons avec une quantité future négative. J'ai besoin de tenir compte de cette quantité négative future dans l'offre antérieure, de sorte que nous ne compliquons pas le problème en survente notre offre.Traitement des valeurs négatives avec sql

Dans l'ensemble de données suivantes, je dois préparer la demande sur 10-19 en appliquant la quantité négative la chaîne jusqu'à ce que je suis parti avec une quantité positive:

"ID","SKU","DATE","SEASON","QUANTITY" 
"1","001","2012-06-22","S12","1656" 
"2","001","2012-07-13","F12","1986" 
"3","001","2012-07-27","F12","-283" 
"4","001","2012-08-17","F12","2718" 
"5","001","2012-08-31","F12","-4019" 
"6","001","2012-09-14","F12","7212" 
"7","001","2012-09-21","F12","782" 
"8","001","2012-09-28","F12","2073" 
"9","001","2012-10-12","F12","1842" 
"10","001","2012-10-19","F12","-12159" 

Je dois obtenir à ceci:

"ID","SKU","DATE","SEASON","QUANTITY" 
"1","001","2012-06-22","S12","1656" 
"2","001","2012-07-13","F12","152" 

J'ai regardé en utilisant une boucle while ainsi qu'un extérieur, mais ne peut pas appliquer semblent trouver un moyen de le faire encore. Toute aide serait très appréciée. Cela devrait fonctionner pour SQL Server 2008 R2.

Voici un autre exemple:

"1","002","2012-07-13","S12","1980" 
"2","002","2012-08-10","F12","-306" 
"3","002","2012-09-07","F12","826" 

deviendrait:

"1","002","2012-07-13","S12","1674" 
"3","002","2012-09-07","F12","826" 
+1

Je ne suis pas en mesure de concilier votre description de votre problème avec l'exemple que vous fournissez .. Pourriez-vous vérifier l'exactitude ou, si elle est correcte, ajouter d'autres explications sur les raisons pour lesquelles ce sont les résultats souhaités? En outre, même si cela n'a pas fonctionné, il serait probablement apprécié si vous avez posté votre solution en utilisant la boucle while et 'outer apply'. –

+0

Dans votre deuxième exemple, pourquoi un F12 - 306 at - il été tiré d 'un S12 1980? (ou est-ce que la ligne 2 devrait être S12 au lieu de F12?) Les saisons semblent ne pas avoir d'importance seulement pour le SKU? – xQbert

+0

Il est plus facile de résoudre ce problème si vous détailler comment les nombres sur la production sont devenus –

Répondre

0

Vous ne semblez pas obtenir beaucoup de réponses - donc voici quelque chose si vous n'obtiendrez pas le droit « comment -Pour le faire en pur SQL '. Ignorez cette solution s'il y a quelque chose de SQLish - c'est juste un codage défensif, pas élégant. Si vous voulez obtenir une somme de toutes les données à la même saison, pourquoi supprimer des enregistrements en double - juste dehors, exécuter une boucle foreach, additionner toutes les données avec la même valeur de saison, mettre à jour le tableau avec les bonnes valeurs et supprimer les entrées inutiles . Voilà l'une des façons de le faire (pseudocode):

productsArray = SELECT * FROM products 
processed = array (associative) 
foreach product in productsArray: 
    if product[season] not in processed: 
    processed[season] = product[quantity] 
    UPDATE products SET quantity = processed[season] WHERE id = product[id] 
    else: 
    processed[season] = processed[season] + product[quantity] 
    DELETE FROM products WHERE id = product[id] 
0

est ici un CROSS APPLY - testé

SELECT b.ID,SKU,b.DATE,SEASON,QUANTITY 
FROM (
    SELECT SKU,SEASON, SUM(QUANTITY) AS QUANTITY 
    FROM T1 
    GROUP BY SKU,SEASON 
) a 
CROSS APPLY (
    SELECT TOP 1 b.ID,b.Date FROM T1 b 
    WHERE a.SKU = b.SKU AND a.SEASON = b.SEASON 
    ORDER BY b.ID ASC 
) b 
    ORDER BY ID ASC 
Questions connexes