Autor |
Beitrag |
Matthias-K
      
Beiträge: 271
Win95, Win98, Win2000, WinXP, Linux
D2, D4 Client/Server, D5 Enterprise, D6 Enterprise, D7 Enterprise, Delphi2005, C/C++ 3.0, C/C ++ 5.0, C/C++ 6.0
|
Verfasst: Fr 06.01.06 10:56
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
_________________ Ein Spezialist ist ein Mensch, der immer mehr von immer weniger weis, bis er alles von nichts weis!
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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?
_________________ Markus Kinzler.
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: 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.
_________________ Popov
|
|
Matthias-K 
      
Beiträge: 271
Win95, Win98, Win2000, WinXP, Linux
D2, D4 Client/Server, D5 Enterprise, D6 Enterprise, D7 Enterprise, Delphi2005, C/C++ 3.0, C/C ++ 5.0, C/C++ 6.0
|
Verfasst: 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
_________________ Ein Spezialist ist ein Mensch, der immer mehr von immer weniger weis, bis er alles von nichts weis!
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: 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.
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
azrael_7
      
Beiträge: 78
Windows Vista
D2005 Pers. [de]
|
Verfasst: 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 
_________________ -·- Es gibt Leute die bringen Freude, wohin sie gehen -·-
-·- und es gibt Leute, die bringen Freude, wenn sie gehen -·-
|
|
Matthias-K 
      
Beiträge: 271
Win95, Win98, Win2000, WinXP, Linux
D2, D4 Client/Server, D5 Enterprise, D6 Enterprise, D7 Enterprise, Delphi2005, C/C++ 3.0, C/C ++ 5.0, C/C++ 6.0
|
Verfasst: 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!)
_________________ Ein Spezialist ist ein Mensch, der immer mehr von immer weniger weis, bis er alles von nichts weis!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
MarkusB
      
Beiträge: 68
|
Verfasst: 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

|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
Matthias-K 
      
Beiträge: 271
Win95, Win98, Win2000, WinXP, Linux
D2, D4 Client/Server, D5 Enterprise, D6 Enterprise, D7 Enterprise, Delphi2005, C/C++ 3.0, C/C ++ 5.0, C/C++ 6.0
|
Verfasst: 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
_________________ Ein Spezialist ist ein Mensch, der immer mehr von immer weniger weis, bis er alles von nichts weis!
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 08.01.06 21:39
Das geht mit meiner Lösung ohne Probleme (falls Deine DB das kann)
_________________ Na denn, dann. Bis dann, denn.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: So 08.01.06 22:04
UNION müsste Dir weiterhelfen.
|
|
OlliWausD
      
Beiträge: 212
Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
|
Verfasst: 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
_________________ Take it easy
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 09.01.06 14:26
_________________ Na denn, dann. Bis dann, denn.
|
|
Matthias-K 
      
Beiträge: 271
Win95, Win98, Win2000, WinXP, Linux
D2, D4 Client/Server, D5 Enterprise, D6 Enterprise, D7 Enterprise, Delphi2005, C/C++ 3.0, C/C ++ 5.0, C/C++ 6.0
|
Verfasst: 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
_________________ Ein Spezialist ist ein Mensch, der immer mehr von immer weniger weis, bis er alles von nichts weis!
|
|
|