2016-03-23 8 views
4

ich eine Vektor Tabelle in der Datenbank habe:Ein SQL verschiedene ‚Gruppe‘ zusammenfassen Ebene

enter image description here

Basierend auf Daten auf Lager Tabelle, ich als Ausgabe detailliertere Daten haben will:

enter image description here

vorrätig Anzahl stellt die gesamte Menge auf Lager für Artikel A.

Lage Anzahl der tot repräsentiert Menge für Artikel A für jeden Standort

Unterortmenge gibt die Gesamtmenge für Artikel A für einen bestimmten Standort für jeden Unterstandort an.

Ich frage mich, ob es eine Möglichkeit gibt, die detaillierte Ausgabe in einer Abfrage zu erhalten, oder sollte ich jede Abfrage einzeln machen und Code schreiben, um zwischen den Ergebnissen zu verbinden.

Ich könnte schreiben:

  • Um vorrätig Anzahl zu erhalten:

    SELECT Item, Sum(Qty) as StockQty 
    From Stock 
    Group By Item; 
    
  • Um Lage Anzahl zu erhalten:

    SELECT Item, Location, Sum(Qty) as LocationQty 
    From Stock 
    Group By Item, Location; 
    
  • Um zu Unteradresse erhalten:

    SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty 
    From Stock 
    Group By Item, Location, SubLocation; 
    

Und dann hinter in Code, einen Code für die Ausgabe in einem Datagridview schreiben.

Eigentlich suche ich nach einer Abfrage, die alle Daten in einer Datentabelle zurückgibt und sie an die Datagridview bindet.

Jede andere Lösung ist willkommen.

Ich arbeite in AS400 aber wenn es eine Lösung in anderen DBMS gibt, bitte beantwortet, ich werde versuchen, es (wenn möglich) in meiner DBMS-Umgebung arbeiten zu lassen.

+1

Tag dbms verwendet, die Antwort kann davon abhängen. – jarlh

+0

Ich markierte ibm-Midrange für AS400. – ehh

+0

Also ist DB2 das dbms? – jarlh

Antwort

4

Try this:

SELECT t3.Item, t3.StockQty, 
     t2.Location, t2.LocationQty, 
     t1.SubLocation, t1.SubLocationQty 
FROM (
    SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty 
    From Stock 
    Group By Item, Location, SubLocation) AS t1 
JOIN (
    SELECT Item, Location, Sum(Qty) as LocationQty 
    From Stock 
    Group By Item, Location 
) AS t2 ON t1.Item = t2.Item AND t1.Location = t2.Location 
JOIN (
    SELECT Item, Sum(Qty) as StockQty 
    From Stock 
    Group By Item 
) AS t3 ON t1.Item = t3.Item 
+0

danke, nur um es zu testen, es funktioniert perfekt. – ehh

0

Sie könnten mehrere Unterabfragen dafür verwenden.

SELECT Item, 
(SELECT StockQty 
FROM (SELECT Item, Sum(Qty) AS StockQty 
     FROM Stock 
     GROUP BY Item)) AS StockQty 
(SELECT LocationQty 
FROM (SELECT Item, Location, Sum(Qty) AS LocationQty 
     FROM Stock 
     GROUP BY Item, Location)) AS LocationQty, 
(SELECT SubLocationQty 
FROM (SELECT Item, Location, SubLocation, Sum(Qty) AS SubLocationQty 
     FROM Stock 
     GROUP BY Item, Location, SubLocation)) AS SubLocationQty 
FROM Stock 
+0

Sie benötigen korrelierte Unterabfragen, ohne Gruppe nach. – jarlh

4

wie etwa:

SELECT Item, Location, SubLocation, Sum(Qty) as SubLocationQty 
From Stock 
Group By Item, Location, SubLocation with rollup 

wenn Sie Rollup in Ihrem RDBMS haben es wirklich einfach ist. Ersetzen Sie einfach die 'Null' erhalten Sie mit der Zeichenfolge 'Total' und Sie sind homefree .....

+0

Sie könnten in Erwägung ziehen, zu zeigen, wie die Ergebnisse aussehen würden. Da es ein bisschen anders ist als das Beispiel, das das OP angefordert hat. Ich denke, es ist eine bessere Wahl, aber das OP könnte nicht. 'ROLLUP' ist in der derzeit unterstützten Version von DB2 für IBM i verfügbar. – Charles

+0

Einverstanden. Hätte das OP uns ein praktikables Beispiel geliefert. Ich kann natürlich etwas bieten, aber weiß nicht, ob es von Interesse ist. –