2017-09-15 1 views
1

Ich habe zwei Tabelle mit Primärschlüssel und Fremdschlüssel (MATERIALID)Auf Öffnen, Schließen Auf Veröffentlichung SQL-Abfrage

  1. Materialtabelle (Multiple-Material)
 
MaterialId MaterialName OpeningStock 
1   Pen   100 
2   Pencil   50 
  1. Materialbestand (Multiple Materialeingang)
 
MaterialId PurchaseQty SalesQty Date 
1   500   0   2016-12-15 
1   0    0   2016-12-16 
1   300   0   2016-12-17 
1   0    400   2016-12-18 
1   0    0   2016-12-19 
1   0    0   2016-12-20 
1   0    400   2016-12-21 
1   200   100   2016-12-22 
Jetzt

Als ich Pass @FromDate und @Todate I ausgegeben werden soll wie unten:

 
Date   MaterialName OpeningStock PurchaseQty SalesQty ClosingStock 
2016-12-15 Pen   100   500   0   600 
2016-12-16 Pen   600   0    0   600 
2016-12-17 Pen   600   300   0   900 
2016-12-18 Pen   900   0    400   500 
2016-12-19 Pen   500   0    0   500 
2016-12-20 Pen   500   0    0   500 
2016-12-21 Pen   500   0    400   100 
2016-12-22 Pen   100   200   100   200 

Hinweis:
1. Wenn etwas nicht in Ordnung ist Tabellen auf Datenbank so, bitte leite mich, wie das zu handhaben Lage. 2. Und finden Sie auch Aktuelles Datum Lager von zwei Tabellen

+0

Haben Sie bisher versucht, das Problem zu lösen? –

+0

@KETULSONI bitte zeigen Sie uns Ihre Frage, wo Sie etwas ausprobiert haben? –

+0

1. Rekursive CTE zur Erstellung einer Liste von Daten 2. Kumulierte Summe –

Antwort

0

Sie suchen nach einer rollenden Summe der verschiedenen Mengenwerte. Eine Möglichkeit, dies zu tun, ist mit korrelierten Unterabfragen:

SELECT 
    t1.Date, 
    mt.MaterialName, 
    (SELECT OpeningStock FROM [Material Table] WHERE MaterialId = t1.MaterialId) + 
    COALESCE((SELECT SUM(t2.PurchaseQty - t2.SalesQty) FROM [Material Stock] t2 
    WHERE t2.Date < t1.Date AND t1.MaterialId = t2.MaterialId), 0) AS OpeningStock, 
    t1.PurchaseQty, 
    t1.SalesQty, 
    (SELECT OpeningStock FROM [Material Table] WHERE MaterialId = t1.MaterialId) + 
COALESCE((SELECT SUM(t2.PurchaseQty - t2.SalesQty) FROM [Material Stock] t2 
    WHERE t2.Date <= t1.Date AND t1.MaterialId = t2.MaterialId), 0) AS ClosingStock 
FROM [Material Stock] t1 
INNER JOIN [Material Table] mt 
    ON t1.MaterialId = mt.MaterialId 
ORDER BY 
    mt.MaterialName, 
    t1.Date; 

Beachten Sie, dass es schlecht ist Tabellenentwurf sein Speicher der Öffnung Bestandswert in einer separaten Tabelle aus dem Materialbestand Tabelle. Dies bedeutet, dass die obige Abfrage keine Bleistiftsätze zurückgeben würde. Ein besserer Ansatz wäre es, für jedes Material einen Saatdatensatz in den Materialbestand einzufügen, wobei der Betrag der Anfangsbestand ist.

Ausgang:

enter image description here

Demo hier:

Rextester

+0

Danke, aber was ist mit "Bleistift" Eröffnung Lager ist 50 Menge. –

+0

Sie haben niemals Bleistiftdaten bereitgestellt, daher erscheint nichts. Die Datensätze, die Sie oben sehen, basieren auf der Materialtabelle. Fügen Sie einige Daten für Bleistifte hinzu und Sie werden ausgegeben. –

+0

Ok, aber wenn einige Daten nicht verfügbar sind? Bitte überprüfen Sie - http://rextester.com/NDH6665 –

0

tun einfach wie folgt:

SELECT S.DATE, M.MaterialName, M.OpeningStock, S.PurchaseQty, S.SalesQty, SUM((M.OpeningStock+S.PurchaseQty)-S.SalesQty)ClosingStock FROM #TABLE 
(
     SELECT * FROM MaterialTABLE 
) M 

INNER JOIN Material S ON S.MaterialId = M.MaterialId where s.date between @FromDate and @Todate 
Verwandte Themen