Entwickler-Ecke

Datenbanken - Aus zwei SQL's mach eine ...


D. Annies - So 05.04.09 19:31
Titel: Aus zwei SQL's mach eine ...
Hi, Delpher,

kann man aus den folgenden zwei Abfragen eine einzige machen, so dass dann alle Infos in einer Tabelle zu sehen sind?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
with QBuecher2 do
begin
  fname := concat(label30.caption, 'OUTXLS\' + 'Ausleihsumme' +inttostr(t)+inttostr(m)+inttostr(j)+ '.xls');
  Close; SQL.Clear;
    SQL.Text := format('select distinct B.Klasse, count(*) as anzahl from "%s" B ', [TbArtikel.tablename])+
                  'where (B.Klasse like ''10%'' or B.Klasse like ''9%'' or B.Klasse like ''8%'' ' +
                     'or  B.Klasse like ''7%'' or B.Klasse like ''6%'' or B.Klasse like ''5%'') ' +
                  'group by B.Klasse';
  Open;
  TeilmengenausgabeSG(QBuecher2);
  Close; SQL.Clear;
    SQL.Text := format('select distinct B.Titel, B.Klasse from "%s" B ', [TbArtikel.tablename])+
         'where (B.Klasse like ''10%'' or B.Klasse like ''9%'' or B.Klasse like ''8%'' or ' +
                'B.Klasse like  ''7%'' or B.Klasse like ''6%'' or B.Klasse like ''5%'') ' +
         'order by B.Klasse';
  Open;
  TeilmengenausgabeSG(QBuecher2);
end;


Vielen Dank für Hilfe,
Detlef


D. Annies - So 05.04.09 21:54

Ich habe jetzt den (funktionierenden) folgenden Befehl:


Delphi-Quelltext
1:
2:
3:
4:
SQL.Text := format('select B.Titel, count(*) as anzahl, B.Klasse from "%s" B ', [TbArtikel.tablename])+
         'where (B.Klasse like ''10%'' or B.Klasse like ''9%'' or B.Klasse like ''8%'' or ' +
                'B.Klasse like  ''7%'' or B.Klasse like ''6%'' or B.Klasse like ''5%'') ' +
         'group by B.Klasse, B.Titel';


Geht's eleganter?
Detlef


mkinzler - So 05.04.09 21:56

Welches DBMS?
Vielleicht wäre die Verwendung von (SQL-)Parametern eine Option


D. Annies - Mo 06.04.09 07:15

Hi, Markus,

ich verwende D6 Enterprise und die normalen Delphi-DB-Kompos.
Die Aufzählung 10 5 6 7... kommt mir auch ein bisschen doof vor, deshalb wohl deine Anregung mit einem Parameter, aber wie muss ich den denn wählen?

Gruß, Detlef


alzaimar - Mo 06.04.09 07:48

Ein schönes Beispiel, das die Struktur einer Datenbanktabelle wohlüberlegt sein sollte. Hier wären zwei Spalten ('Klassenstufe' als Zahl ,'Klassenzusatz' als String) hinsichtlich der vorzunehmenden Abfragen sicherlich die bessere Wahl.
Dann würde die Abfrage auf ein simples select * from <Tabelle> where Klassenstufe between 5 and 10
hinauslaufen (Normalisierungsfetischisten würden hier den Klassen sogar eine eigene Tabelle spendieren).

So bleibt Dir im Prinzip nichts Anderes übrig, als deine Abfrage so zu gestalten, wie Du es bisher getan hast. Man könnte die Abfrage durch ein 'BETWEEN' etwas übersichtlicher machen, aber das Grundproblem bleibt.

So könnte eine Verkürzung der Abfrage aussehen, wenn die 'Klasse' in der Form '5A', '6C' etc. formatiert ist.

SQL-Anweisung
1:
select * from <Tabelle> where (Klasse between '5A' and '9Z'or (Klasse like '10%')                    

Eleganter ist das nicht, dazu musst Du die Tabelle umformen (siehe 1.Absatz)


D. Annies - Mo 06.04.09 08:14

Danke, Alzaimer. Schade, dass ich das nicht früher gewusst habe.
Gruß, Detlef


Nersgatt - Mo 06.04.09 08:43

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
Schade, dass ich das nicht früher gewusst habe.

Meiner Erfahrung nach ist es am besten, solche "Fehler" jetzt zu beheben, auch wenn es etwas Arbeit macht, als es dabei zu belassen. Sonst wird man sich jedes Mal darüber ärgern, wenn man an diese Stelle gelangt und hat vermutlich in der Summe mehr Arbeit, als wenn man es jetzt einmal richtig macht.
Mit jeder Programmerweiterung wird es schwieriger und damit auswändiger, es umzustellen.


D. Annies - Mo 06.04.09 09:25

Danke, Nersgatt,
ich gucke mir den Aufwand mal an,
Detlef