2016-06-06 9 views
2

Ich versuche, Daten aus ProdcutStock Tabelle durch Gruppierung mit jedem Kunden, Vertrieb auszuwählen.Zeige Bestandsdetails nach jedem Verkauf

Meine Tabellen sind wie folgt

SalesMaster

Id CustId TDate 
1 2  2016-06-03 
2 1  2016-06-03 
3 2  2016-06-06 
4 2  2016-06-06 
5 1  2016-06-06 
6 3  2016-06-06 

SalesDetails

Id SalesId ProductId Qty 
1 1  2  4.00 
2 1  1  5.00 
3 2  2  21.00 
4 2  2  88.00 
5 2  1  8.00 
6 2  3  9.00 
7 2  3  4.00 
8 2  1  77.00 
9 2  2  4.00 
10 2  3  8.00 
11 2  2  7.00 
12 3  2  41.00 
13 3  3  10.00 
14 4  2  25.00 
15 4  1  49.00 
16 5  3  50.00 
17 5  1  50.00 
18 6  2  10.00 
19 6  3  20.00 

ProductStock

Id Date OpeningStock TotalProduction TotalSales ClosingStock 
1 2016-06-05 100.00  0.00   0.00  100.00 
2 2016-06-06 100.00  325.00   255.00  170.00 
3 2016-06-07 200.00  0.00   0.00  200.00 
5 2016-06-08 200.00  0.00   0.00  200.00 
6 2016-06-09 200.00  0.00   0.00  200.00 
7 2016-06-10 200.00  0.00   0.00  200.00 

Was ich m zu erreichen versuchen, ist der nachstehenden Tabelle

Date OpeningStock Production Sales Customer ClosingStock 
2016-06-05 100.00  0.00  0.00 NULL  100.00 
2016-06-06 100.00  325.00  125.00 XYZ   300.00 
2016-06-06 300.00  0.00  30.00 ABC   270.00 
2016-06-06 270.00  0.00  100.00 PQR   170.00 
2016-06-07 170.00  0.00  0.00 NULL  200.00 

Was erhalte ich Code unten: (Siehe Öffnen und Schließen Auf)

Date Opening Production Sales Name Closing 
2016-06-05 100.00 0.00 0.00 NULL 100.00 
2016-06-06 100.00 325.00 125.00 XYZ  300.00 
2016-06-06 100.00 325.00 30.00 ABC  395.00 
2016-06-06 100.00 325.00 100.00 PQR  325.00 
2016-06-07 200.00 0.00 0.00 NULL 200.00 

Was ich getan habe, ist wie folgt:

SELECT PS.Date, PS.OpeningStock , PS.TotalProduction 
, SUM(COALESCE(SD.Qty,0)) AS SALES, CM.Name 
, (COALESCE(PS.OpeningStock,0)) + COALESCE(PS.TotalProduction,0) - SUM(COALESCE(SD.Qty,0)) AS ClosingStock 
FROM ProductStock PS LEFT JOIN SalesMaster SM ON PS.Date = SM.Date 
LEFT JOIN SalesDetails SD ON SM.Id = SD.SalesId 
LEFT JOIN CustomersMaster CM ON SM.CustomerId = CM.Id 
GROUP BY PS.Date, CM.Name, PS.OpeningStock, PS.TotalProduction 
ORDER BY PS.Date 

Ich habe auch versucht, mit LAG zu arbeiten, wie ich SQL Server 2012 benutze, aber ich habe nicht, wie man anwendet.

+0

Bitte CustomersMaster Tisch. – vercelli

+0

@vercelli: Es war nicht erforderlich, da ich nur den Namen von dieser Tabelle wollte. JamieD77 [Antwort] (http://stackoverflow.com/questions/37660162/show-stock-details-by-each-sales#37661243) funktionierte perfekt. – hims056

Antwort

3

Dies sollte Ihnen nahe kommen. Sie können SUM() OVER() verwenden, um eine laufende Summe von VERKÄUFEN zu erhalten, und berechnen Sie nur die Mengen mit diesem.

;WITH ProductDetail AS (
    SELECT ps.[Date], 
      ps.OpeningStock, 
      ps.TotalProduction, 
      ps.ClosingStock, 
      sm.CustId, 
      COALESCE(SUM(Qty),0) Sales, 
      ROW_NUMBER() OVER (PARTITION BY ps.[Date] ORDER BY CustID) Rn, 
      SUM(SUM(Qty)) OVER (PARTITION BY ps.[Date] ORDER BY CustID) SalesRunningTotal 
    FROM ProductStock ps 
      LEFT JOIN SalesMaster sm ON ps.[Date] = sm.[Date] 
      LEFT JOIN SalesDetail sd ON sd.SalesID = sm.ID 
    GROUP BY ps.[Date], 
      ps.OpeningStock, 
      ps.TotalProduction, 
      ps.ClosingStock, 
      sm.CustId 
) 
SELECT [Date], 
     CASE WHEN Rn = 1 THEN OpeningStock ELSE OpeningStock + (TotalProduction - SalesRunningTotal + Sales) END OpeningStock, 
     CASE WHEN Rn = 1 THEN TotalProduction ELSE 0 END [Production], 
     Sales, 
     CustId, 
     CASE WHEN Rn = 1 THEN OpeningStock + TotalProduction - Sales 
      ELSE OpeningStock + (TotalProduction - SalesRunningTotal) 
      END [ClosingStock] 
FROM ProductDetail 
+0

Danke mate das hat perfekt funktioniert. Genau das, was ich versuchen wollte. – hims056

0

Ich glaube, das Problem ist, dass Sie nicht direkt auf die ID in ProductStock beziehen sich. Haben Sie bemerkt, dass die Informationen, die falsch sind, direkt aus ProductStock gezogen wurden? Zum Beispiel für das Datum, das dreimal wiederholt, 2016-06-06, sind alle drei 100 aber auf ProductStock nur die erste ist 100. Und wieder für TotalProduction. Alle drei sind 325, wenn nur die erste 325 ist. Da Sie sie nur nach dem Datum und nicht nach der ID verweisen, werden sie falsche Informationen ziehen () Was ist der Sinn der ID, wenn Sie sie nicht verwenden?).

2016-06-06 a 
2016-06-06 b 
2016-06-06 c 

Siehe aus dieser Menge nur hat ich mir die richtigen Buchstaben nicht ziehen kann, basierten weg von dem Datum (das ist, was Ihre Abfrage zu tun versucht). Wenn ich in diesem speziellen Fall wollte, würde ich es durch die Buchstaben bestellen müssen und dann den Buchstaben basierend auf seiner Reihennummer erhalten (die Reihennummer entspricht der Reihenfolge im Alphabet).

1 2016-06-06 a 
2 2016-06-06 b 
3 2016-06-06 c 

nun die Zeilennummer verwende ich muss nicht. Ich habe eine ID für jeden einzelnen, also kann ich einfach nur einen verwenden, um eine Information zu erhalten, die ich möchte. Ihnen fehlt die Verwendung der ID in ProductStock.

(Ihre Anfrage unberührt)

FROM ProductStock PS LEFT JOIN SalesMaster SM ON PS.Date = SM.Date 
LEFT JOIN SalesDetails SD ON SM.Id = SD.SalesId 
LEFT JOIN CustomersMaster CM ON SM.CustomerId = CM.Id 
GROUP BY PS.Date, CM.Name, PS.OpeningStock, PS.TotalProduction 
ORDER BY PS.Date 

Die einzigen IDs beziehen Sie die Kunden-IDs in SalesMaster und CustomersMaster und IDs in SalesMaster und SalesDetails werden. In diesem Fall, da haben Sie schon alle deine verbindet man konnte ganz einfach nur eine WHERE Klausel gegen Ende hinzuzufügen ...

WHERE PS.ID = SM.ID 

ist Ich hoffe, das hilft :)

Verwandte Themen