SQL Spalten Sortierung und Zusammenfassung

ACC_Entwickler

Aktiver Benutzer
Beiträge
28
Moin zusammen, ich habe folgendes Problem:
Meine Datenbank sieht schmematisch und verkürzt in etwa so aus:
Nummer Preis Anzahl Item Part
1.................12...........1..........1001...X
1.................10...........2..........1001...Y
1.................14...........1..........3001...Z
2.................16...........12........1001...A
2.................17...........1..........2001...B
2.................18...........7..........2001...G
2.................1..............5..........3001...F
3.................17...........2..........1001...X
4.................9..............1..........4001...Q

Es gibt für jede Nummer teilweise mehrere Items auf die verschiedene Parts gebucht werden. Ich muss nun den Gesamt Preis für jedes Item zu einer bestimmten Nummer herausfinden. ERGO Müsste ich für Nummer 1 den Preis für Item 1001 (12*1+10*2) und 3001 (14*1) wissen usw. Mein Problem ist, dass ich nicht weiß wie ich meine Bedingung genau definieren kann. Ich muss zunächst ja irgendwie die Abfrage auf eine Nummer und dann auf das jeweilige Item begrenzen. Über Lösungsvorschläge wäre ich sehr dankbar.
MfG
Philipp
 
Werbung:
ich glaube, du suchst eine Aggregierung..

Code:
postgres=# select * from acc;
 nummer | preis | anzahl | item 
--------+-------+--------+------
      1 |    12 |      1 |  101
      1 |    10 |      2 |  101
      1 |    14 |      1 |  301
      2 |    16 |     12 |  101
      2 |    17 |      1 |  202
(5 rows)

postgres=# select nummer, sum(preis * anzahl) from acc group by nummer;
 nummer | sum 
--------+-----
      2 | 209
      1 |  46
(2 rows)

postgres=#
 
ich glaube, du suchst eine Aggregierung..

Code:
postgres=# select * from acc;
 nummer | preis | anzahl | item
--------+-------+--------+------
      1 |    12 |      1 |  101
      1 |    10 |      2 |  101
      1 |    14 |      1 |  301
      2 |    16 |     12 |  101
      2 |    17 |      1 |  202
(5 rows)

postgres=# select nummer, sum(preis * anzahl) from acc group by nummer;
 nummer | sum
--------+-----
      2 | 209
      1 |  46
(2 rows)

postgres=#
Danke schonmal für die Info, ich habe aber das Problem dass ich nicht nur nach der Nummer gruppieren muss, sondern auch nach dem Item, sprich erst sortieren nach nummer, dann sortieren nach Item und dann die Rechenoperatoren, ist das auch irgendwie möglich, und zwar mit einer einzigen Abfrage?
Der GROUP BY Befehl ist mir geläufig, ich habe aber das Problem, dass ich in meiner Abfrage noch mehrere Werte abfrage , die nicht gruppiert werden sollen, deshalb weiß ich zudem nicht, wie sich das verhält. Oder ob ich dann zwangsläufig mehrere Abfragen machen muss und die Zwischenspeichere um dann in einer View die Ergebnisse der vorherigen Abfragen einfliessen zu lassen.
Grüße
Philipp
 
Code:
postgres=# select nummer, item, sum(preis * anzahl) from acc group by nummer, item;
 nummer | item | sum 
--------+------+-----
      2 |  202 |  17
      2 |  101 | 192
      1 |  301 |  14
      1 |  101 |  32
(4 rows)

postgres=#

da ich nicht weiß, was Du noch so abfragen willst, kann ich derzeit kaum weiter helfen.
 
Code:
postgres=# select nummer, item, sum(preis * anzahl) from acc group by nummer, item;
 nummer | item | sum
--------+------+-----
      2 |  202 |  17
      2 |  101 | 192
      1 |  301 |  14
      1 |  101 |  32
(4 rows)

postgres=#

da ich nicht weiß, was Du noch so abfragen willst, kann ich derzeit kaum weiter helfen
In meiner Abfrage frage ich nicht nur die Tabelle die hier im Forum ist ab sondern auch weitere Spalten aus anderen Tabellen, um daraus eine View zu machen. Die Tabellen verknüpfe ich dann mit FROM LEFT JOIN... so weit so gut. Wenn ich den GROUP BY befehl jetzt hinter das FROM schreibe versucht das Programm dann dann doch auch die anderen Tabellen auch nach Item und Nummer zu verknüpfen? Wenn das der Fall wäre, müsste ich dann die Sachen die Ich gruppieren will extra abfragen und irgendwie Zwischenspeichern?
 
Group By schreibst du ganz zu Schluss.

Beispiel:
Code:
create table a(eins integer, zwei integer);
create table b(eins integer, zwei integer);
insert into a values (1, 2);
insert into b values (1, 2);
select sum(a.eins+b.eins) from a inner join b on (a.eins = b.eins) group by a.eins;

Jetzt ist das Ergebnis 2, weil die Summe von 1+1 nunmal 2 ist ;)
Ja, ein sehr einfaches Beispiel, aber group by kommt immer ganz zum schluss :D
 
Group By schreibst du ganz zu Schluss.

Beispiel:
Code:
create table a(eins integer, zwei integer);
create table b(eins integer, zwei integer);
insert into a values (1, 2);
insert into b values (1, 2);
select sum(a.eins+b.eins) from a inner join b on (a.eins = b.eins) group by a.eins;

Jetzt ist das Ergebnis 2, weil die Summe von 1+1 nunmal 2 ist ;)
Ja, ein sehr einfaches Beispiel, aber group by kommt immer ganz zum schluss :D
Ich versuche das mal präziser darzustellen...
Das ist meien Abfrage, ich Frage mehrere Tabellen ab Aufträge,Beanstandungen und Warenbuchung
Gruppiert soll aber nur die Warenbuchung werden... wie ist das möglich? Einfach Group by am Ende? stelle ich mir unlogisch vor?!
Ich habe leider zZ keine Möglichkeit das zu testen, da mir der Admin keinen Zugriff auf den Server gibt... deshalb kann ich nicht mit sicherheit sagen dass es nicht funktioniert, aber das wirkt für mich vond er Logik her nicht richtig...
SELECT RIGHT(Format(CAST([Aufträge].[counter] AS int), '##-####'), 7) AS WO,
Beanstandungen.[Nr] AS Item,
Beanstandungen.[Beanstandungen] AS Task Beschreibung,
LEFT(STUFF(Format(CAST([Beanstandungen].[Memo] AS int), '##-####'), 1, 4,''),7) AS WQ,
IIF(Beanstandungen.[beInspector2ID] IS NOT NULL AND Beanstandungen.[beInspector1ID] IS NOT NULL, 'FUI', IIF(Beanstandungen.[beInspector2ID] IS NULL AND Beanstandungen.[beInspector1ID] IS NOT NULL, 'FU',
IIF(Beanstandungen.[beInspector1ID] IS NULL AND Beanstandungen.[F-Datum] IS NOT NULL , 'F',))) AS Status,
Beanstandungen.[Atime] AS MH gebucht,

Hier müsste jetzt noch die gesuchte Funktion rein die irgendwie so aussieht
SUM(Warenbuchung.[EK-Preis] * Warenbuchung.[Anzahl Ausgänge])

FROM (Aufträge LEFT JOIN Beanstandungen ON Aufträge.[Auftragsnummer] = Beanstandungen.[Auftragsnummer])
LEFT JOIN Warenbuchung ON ON Aufträge.[Auftragsnummer] = Warenbuchung.[Auftragsnummer]
WHERE (((Aufträge.[OrderType]) = 'Auftrag') AND ((Charindex('deleted', [Auftragnr_neu])) = 0 OR
(Charindex('deleted', [Auftragnr_neu])) IS NULL) AND ((Charindex('Auftrag', [OrderType])) = 1) AND ((Aufträge.[counter]) IS NOT NULL));

GROUP BY Warenbuchung.[Auftragsnummer], Warenbuchung.[Item];

Funktioniert das so? Ich will ja nur die Abfrage aus Warenbuchung gruppiert haben und nicht die anderen zuvor abgefragten Tabellen
 
ich erweitere mal meine Demo-Tabelle:

Code:
postgres=# begin;
BEGIN
postgres=*# alter table acc add column bla int;
ALTER TABLE
postgres=*# update acc set bla = random() * 10000;
UPDATE 5
postgres=*# select * from acc;
 nummer | preis | anzahl | item | bla  
--------+-------+--------+------+------
      1 |    12 |      1 |  101 |  708
      1 |    10 |      2 |  101 | 8084
      1 |    14 |      1 |  301 | 6564
      2 |    16 |     12 |  101 | 3725
      2 |    17 |      1 |  202 | 4560
(5 rows)

Bisher haben wir:

Code:
postgres=*# select nummer, item, sum(preis * anzahl) from acc group by nummer, item;
 nummer | item | sum 
--------+------+-----
      2 |  202 |  17
      2 |  101 | 192
      1 |  301 |  14
      1 |  101 |  32
(4 rows)

postgres=*#

Du willst nun auch noch die neue bla-Spalte anzeigen, korrekt?

Frage: für nummer = 1 und und item = 101, welchen Wert willst Du für bla anzeigen, 708 oder 8084?
 
ich erweitere mal meine Demo-Tabelle:

Code:
postgres=# begin;
BEGIN
postgres=*# alter table acc add column bla int;
ALTER TABLE
postgres=*# update acc set bla = random() * 10000;
UPDATE 5
postgres=*# select * from acc;
 nummer | preis | anzahl | item | bla 
--------+-------+--------+------+------
      1 |    12 |      1 |  101 |  708
      1 |    10 |      2 |  101 | 8084
      1 |    14 |      1 |  301 | 6564
      2 |    16 |     12 |  101 | 3725
      2 |    17 |      1 |  202 | 4560
(5 rows)

Bisher haben wir:

Code:
postgres=*# select nummer, item, sum(preis * anzahl) from acc group by nummer, item;
 nummer | item | sum
--------+------+-----
      2 |  202 |  17
      2 |  101 | 192
      1 |  301 |  14
      1 |  101 |  32
(4 rows)

postgres=*#

Du willst nun auch noch die neue bla-Spalte anzeigen, korrekt?

Frage: für nummer = 1 und und item = 101, welchen Wert willst Du für bla anzeigen, 708 oder 8084?
Ich will für nummer 1 und item 101 den Preis (12+10*2) 32 anzeigen lassen und zusätzlich aus anderen Tabellen noch weitere Werte die nichts mit dieser Gruppierung zu tun haben aber über die Nummer verknüpft sind.
Danke schonmal für die rege Beteiligung und die Unterstützung.
 
zusätzlich aus anderen Tabellen noch weitere Werte
ob das aus einer hejointen Tabelle kommt oder in dieser Tabelle schon steht ist für das Problem irrelevant. Wenn Du für die Kombination nummer 1 und item 101 in der anderen Tabelle 42 unterschiedliche Werte hast - welcher soll angezeigt werden? Das ist ein prinzipielles, logisches Problem, welches Du offenbar noch nicht vollständig verstanden hast.
 
Werbung:
Ich will für nummer 1 und item 101 den Preis (12+10*2) 32 anzeigen lassen und zusätzlich aus anderen Tabellen noch weitere Werte die nichts mit dieser Gruppierung zu tun haben aber über die Nummer verknüpft sind.
Danke schonmal für die rege Beteiligung und die Unterstützung.
Basis ist die Nummer... zu dieser Nummer möchte ich alle informationen aus einer anderen Tabelle angezeigt bekommen. Zudem die Info wieviel die einzelnen Items genau kosten. Dass ich dann eine Spalte habe in der Die nummer duplikate hat ist mir egal.
ALs BSP: Aus TAbelle 1 Wie oben beschrieben: den GesamtPreis für ein Item und zusätzlich aus Tabelle 2 die Task Beschreibung für eben jenes Item

Tab1
nummer | preis | anzahl | item
--------+-------+--------+------
1 | 12 | 1 | 101
1 | 10 | 2 | 101
1 | 14 | 1 | 301
2 | 16 | 12 | 101
2 | 17 | 1 | 202
Tab2
nummer | Task Besch | item |
--------+--------------+----+
1 | BLaBLaBla | 101
1 | BLiblibli | 301
2 | BLUBLUBLU| 101
2 | BLOBLOBLO| 202
 
Zurück
Oben