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:


Deine Tabelle sieht z.B so aus

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 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.


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)


Robert.Wachtel - So 08.01.06 22:04

UNION [http://www.datenbank-sql.de/oracle-mengen.htm] müsste Dir weiterhelfen.


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 user profile iconChristian 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