Entwickler-Ecke
Datenbanken - Kompilizierte SQL Anweisung
Matthias-K - Fr 06.01.06 10:56
Titel: Kompilizierte SQL Anweisung
moin,
ich hab eine tabelle mit artikeln, diese sind in gruppen unterteilt. jetzt will ich folgede abfrage realisieren:
und zwar, sollen alle artikel der tabelle genommen werden, und nach gruppen grupiert werden. das ist ja alles kein problem. allerdings soll das ganze aufgesplittet werden, und zwar in artikel mit einer breite bis zu 15 und ab 15 mm!
sozusagen sollte das ergebnis so aussehen:
gruppe a <15mm menge
gruppe a >15mm menge
gruppe b <15mm menge
gruppe b >15mm menge
usw.
wie müsste das statemant aussehen, damit ich ein solches ergebnis bekomme?
matthias
mkinzler - Fr 06.01.06 11:46
Du willst eine Abfrage die dir 4 Gruppen bildet?
das wirst du nicht mit einer einfachen Abfrage schaffen. Könnte mit einer SP gelöst werden.
Welche Datenbank?
Popov - Fr 06.01.06 11:56
Verstehe ich noch nicht ganz. Willst du die Ausgabe so sortieren?
Also - unabhängig dessen, daß ich mir noch darüber keine gedanken gemacht habe - gehen geht fast alles, auch wenn das tief verschaltelt wird, aber an dieser Stelle stellt sich die Frage für welche Datenbank? Oracle bietet Möglichkeiten, wo du bei mySQL garnicht darüber nachdenkst.
Aber auch so müßte das glaube ich kein Problem sein. Nur leider habe ich gerade keine Zeit. Wenn das heute Abend immer noch nicht gelöst ist, dann gucke ich mal ob mir was einfällt.
Matthias-K - Fr 06.01.06 13:44
die db ist ne kleine oracle 10!
sinn des ganzen soll sein, das die artikel so gruppiert werden, das ich die mengen unter 15mm und über 15 mm aufgesplittet bekomme!
nach meiner abfrage kommt sowas bei raus:
gruppe a menge breite
gruppe b menge breite
gruppe c menge breite
usw.
jetzt soll das aber so aufgeschlüsselt werden:
gruppe a menge breite bis 15mm
gruppe a menge breite ab 15mm
gruppe b menge breite bis 15mm
gruppe b menge breite ab 15mm
ich weis, das klingt verwirrend! aber ich kanns im moment ne besser beschreiben!
matthias
noidic - Fr 06.01.06 13:48
SQL-Anweisung
1: 2: 3:
| select count(id), gruppe, case when breite < 15 then 'kleiner' else 'größer' end as breite2 from Tabelle group by gruppe, breite2 |
ungetestet, müsste aber gehen.
azrael_7 - Fr 06.01.06 13:50
wenn du die menge haben willst, versuch mal
Quelltext
1:
| select count(id) where ... from ... group by gruppe, breite |
edit: war zu lahm :)
Matthias-K - Fr 06.01.06 14:19
so, getestet!
geht ne!
hab das statemant jetzt nach euren anweisungen so gebaut:
SQL-Anweisung
1: 2: 3: 4: 5: 6:
| select Gruppe, case when breite >= 15 then '< 15 mm' else '>= 15 mm' end as beschreibung from weg, v_artikel where typ = 'test' and lager = 'regal5' and artikel = 'test' group by gruppe, beschreibung |
und da bringt er mir, das kein group by ausdruck für die spalte "breite" vorhanden ist.
wenn ich diese aber mit in den group befehl setze, kommt natürlich nur müll raus! die spalte soll ja auch ne gruppiert werden, da dieses select in einem anderen select als subselect fungiert und ich diese spalte in dem übergeordneten select noch brauche! (ungruppiert!)
BenBE - Fr 06.01.06 14:54
Rein syntaktisch sollte es, so, wie du's in deinem Posting grad gezeigt hast funzen.
Könntest Du bitte das mit den weiteren Abfragen, die diese Abfrage verwenden sollen, nochmal etwas detailierter erklären? Vielleicht bietet sich hier dann die Nutzung eines Views\SP eher an, als Gruppierungsabfragen (die IIRC nicht die schnellsten sind).
Übrigens: Wie Joinst Du die beiden verwendeten Tabellen? Kann da nämlich kein Inner\Outer Join erkennen, was irgendwie Sinn ergeben würde.
MarkusB - Sa 07.01.06 16:58
Moin, moin!
Also ich würde es so versuchen:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8:
| select gruppe, groesse, sum(menge) from ( select gruppe, menge, (case when breite > 15 then '>15mm' when breite = 15 then '=15mm' else '<15mm') as groesse from tabelle ) group by gruppe, groesse |
Viele Grüße
Markus
:gruebel:
alzaimar - Sa 07.01.06 18:20
Du willst doch wissen, wie viele Dinger je Gruppe vorhanden sind, und zwar detailliert nach Breitengruppe:
Ich würde für jede Gruppe eine Zeile nehmen, das also z.b. soetwas rauskommt:
- Gruppe Menge<10mm Menge<20mm Menge<30mm Menge>30mm
A 21 10 30 0
B 30 12 0 10
Deine Tabelle sieht z.B so aus
Gruppe Menge Breite
A 5 3
Dann geht das mit einer Pivot-Tabelle:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7:
| Select Gruppe, sum (Case when breite between 9 and 10 then Menge else 0 end) as 'Menge<10mm' sum (Case when breite between 10.001 and 20 then Menge else 0 end) as 'Menge<20mm' sum (Case when breite between 20.001 and 30 then Menge else 0 end) as 'Menge<30mm' sum (Case when breite > 30 then Menge else 0 end) as 'Menge>30mm' from MyTable Group by Gruppe |
Dafür braucht man keine Stored Procedure, aber eine View ist immer gut. Ich würd sogar soweit gehen, und selects auf einfache Tabellen gar nicht zuzulassen, sondern dem Client nur views zur Verfügung zu stellen: So kann man die DB ändern, ohne den Client immer anpassen zu müssen, ist aber Geschmackssache.
Matthias-K - So 08.01.06 21:09
hi leutz,
es handelt sich hierbei um eine druckliste.
erst waren es 2 select abfragen!
also nummer eins war ungefähr so:
SQL-Anweisung
1: 2: 3:
| select sum(menge), gruppe from tabelle where breite <= 1500 group by gruppe |
und die 2. halt mit der breite über 1500 mm!
nur müsste ich diese beiden abfragen so verknüpfen, des ich die ergebnisse aus beiden abfragen ordnen kann!
matthias
alzaimar - So 08.01.06 21:39
Das geht mit meiner Lösung ohne Probleme (falls Deine DB das kann)
OlliWausD - Mo 09.01.06 13:56
Mit ner SP is das ziehmlich einfach zu realisieren, wobei es in meinem Fall stark Zeitabhängig von der Anzahl der Gruppen ist.
vielleicht hilfst dir ja
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for select WG,Menge,0, from Tabelle into :WG,:Menge,:KleinerAls15 do begin if Menge < 15 then KleinerAls15 = 1 else KleinerAls15 = 0; Suspend end; |
Ergebnisbeispiel:
gruppe a menge 1
gruppe a menge 0
gruppe a menge 1
gruppe a menge 1
gruppe a menge 0
gruppe b menge 0
gruppe b menge 1
gruppe b menge 1
und anschließend per normalen Query:
Delphi-Quelltext
1: 2: 3: 4: 5:
| Select WG, Sum(Menge), KleinerAls15 from SPname group by WG,KleinerAls15 |
Erbebnis:
gruppe a menge 0
gruppe a menge 1
gruppe b menge 0
gruppe b menge 1
mfg
OlliW
alzaimar - Mo 09.01.06 14:26
Nee, dann lieber UNION
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7:
| select sum(menge), gruppe from tabelle ,'Breite <= 1500' as Hauptgruppe where breite <= 1500 group by gruppe union select sum(menge), gruppe from tabelle ,'Breite > 1500' as Hauptgruppe where breite > 1500 group by gruppe |
Moderiert von
Christian S.: Delphi durch SQL-Tags ersetzt
Matthias-K - Mo 09.01.06 21:55
also ne sp is für ne druckliste etwas übertrieben!
das case in der selectabfrage funktioniert so auch nicht! die ergebnisse sind nicht zu gebrauche, wenn es denn funktioniert!
union is perfekt!
habs jatzt damit umgesetzt! funktioniert einwandfrei!
danke!
matthias
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!