Autor Beitrag
Matthias-K
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Fr 06.01.06 13:48 
ausblenden 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 78

Windows Vista
D2005 Pers. [de]
BeitragVerfasst: Fr 06.01.06 13:50 
wenn du die menge haben willst, versuch mal

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Fr 06.01.06 14:19 
so, getestet!

geht ne!

hab das statemant jetzt nach euren anweisungen so gebaut:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68



BeitragVerfasst: Sa 07.01.06 16:58 
Moin, moin!

Also ich würde es so versuchen:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
Select Gruppe,
       sum (Case when breite between  9     and 10 then Menge else 0 endas 'Menge<10mm'
       sum (Case when breite between 10.001 and 20 then Menge else 0 endas 'Menge<20mm'
       sum (Case when breite between 20.001 and 30 then Menge else 0 endas 'Menge<30mm'
       sum (Case when breite > 30 then Menge else 0 endas '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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: So 08.01.06 22:04 
UNION müsste Dir weiterhelfen.
OlliWausD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 212

Win 2000/XP
Delphi 5 Professional - Interbase/Firebird
BeitragVerfasst: 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

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 09.01.06 14:26 
Nee, dann lieber UNION
ausblenden 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 user profile iconChristian S.: Delphi durch SQL-Tags ersetzt

_________________
Na denn, dann. Bis dann, denn.
Matthias-K Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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!