Entwickler-Ecke

Datenbanken - Ergebnismenge und Anzahl der Datensätze darin in einem SQL ?


rob87 - Mo 15.12.08 12:14
Titel: Ergebnismenge und Anzahl der Datensätze darin in einem SQL ?
Hallo,
ich habe folgendes Problem. Ich dachte mal, dass es am Besten zum Bereich "Datenbank" passt. Ich will mit einem SQL gleichzeitig die Ergebnismenge und die Anzahl der in dieser Ergebnismenge enthaltenen Datensätze bekommen. Geht das?


SQL-Anweisung
1:
2:
3:
select id, wert1, wert2 from tabelle1
where wert2 = 'xyz'
order by id desc

Eine ganz einfache SQL-Abfrage mit einem JOIN und einer order-by-Klausel liefert mir eine Ergebnismenge x. und ich will nun noch wissen, wieviele DS darin enthalten sind. Ich dacht des ginge vll. so:

SQL-Anweisung
1:
2:
3:
4:
select count(*) as Anzahl, id, wert1, wert2 from tabelle1
where wert2 = 'xyz'
group by id, wert1, wert2
order by id desc

Aber dann erhalte ich jeweils die Anzahl an Datensätze für die einzelnen Gruppierungen. Und die group-Klausel weglassen geht ja auch ned?? Rein syntaxmäßig.

PlanB wär halt ein zweites SQL-Statement zur Counter-Ermittlung. :(


Delete - Mo 15.12.08 12:27

Probier es mal so:

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
SELECT id, wert1, wert2, 1 AS RF 
FROM tabelle1
WHERE wert2 = 'xyz'
UNION
SELECT COUNT(*), NULL, NULL, 2 AS RF
FROM tabelle1
WHERE wert2 = 'xyz'
ORDER BY RF ASC, id DESC


Damit müsste in der letzten Zeile die Anzahl stehen.


rob87 - Mo 15.12.08 12:33

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Probier es mal so:

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
SELECT id, wert1, wert2, 1 AS RF 
FROM tabelle1
WHERE wert2 = 'xyz'
UNION
SELECT COUNT(*), NULL, NULL, 2 AS RF
FROM tabelle1
WHERE wert2 = 'xyz'
ORDER BY RF ASC, id DESC


Damit müsste in der letzten Zeile die Anzahl stehen.

OK. Hab des nun mit einem einfachen Statement getestet. Nun hab ich in der letzten Spalte als Name RF und bei den Datensätzen den Wert 1 und bei der Summe den Wert2. Des passt eigentlich soweit. Auch wenn ich mir erst noch der Syntax mächtig werden muss.

Der Begriff Union is mir neu. Werd mal nachforschen, was des is und dann versuchen diese Struktur auf meine Abfrage zu übertragen.

Aber danke schonmal


Delete - Mo 15.12.08 12:43

In diesem Thread gab es eine ähnliche Anforderung, dort habe ich es auch erklärt: http://www.delphiforum.de/viewtopic.php?t=86920&start=0&postorder=asc [http://www.delphiforum.de/viewtopic.php?t=86920&start=0&postorder=asc]


rob87 - Mo 15.12.08 13:04

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
In diesem Thread gab es eine ähnliche Anforderung, dort habe ich es auch erklärt: [url=http://www.delphiforum.de/viewtopic.php?t=86920&start=0&postorder=asc]http://www.delphiforum.de/viewtopic.php?t=86920&start=0&postorder=asc[/url]

OK. Merci.

Nun noch eine kurze Frage. Wie krieg ich nun mein Ergebniswert am Einfachsten in eine INT-Variable?? *g*
Ich kann ja wohl schlecht sagen:

Delphi-Quelltext
1:
count := SQL1.GetValue(1); //... where RF = 2 oder so                    


Also doch 2 SQL-Statements? :lol:


Delete - Mo 15.12.08 13:08

Geh doch einfach mit Last auf den letzten Datensatz und lies das erste Feld aus ;)


Agawain - Mo 15.12.08 13:23

Moin,

wenn Du den Wert nicht in der Ergebnismenge brauchst, kannst Du auch einfach Tdataset.recordcount auslesen ;-)


rob87 - Mo 15.12.08 14:00

user profile iconAgawain hat folgendes geschrieben Zum zitierten Posting springen:
Moin,

wenn Du den Wert nicht in der Ergebnismenge brauchst, kannst Du auch einfach Tdataset.recordcount auslesen ;-)

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Geh doch einfach mit Last auf den letzten Datensatz und lies das erste Feld aus ;)


Beide Methoden werden von meiner speziellen TSQL-Komponente ned unterstützt.


Delete - Mo 15.12.08 14:12

Dann bliebe noch die Möglichkeit, die Sortierung nach dem künstlichen Reihenfolgefeld (RF) umzudrehen und den ersten Datensatz auszulesen.


Agawain - Mo 15.12.08 14:18

hm

kann eigentlich kaum sein, es sei denn, sie ist nicht von TDataset abgeleitet.
RecordCount ist keine Methode, sondern ein nur Lese-Eigenschaft von TDataset.

Wüßte auch nicht, warum man der Kompo das klauen sollte.


rob87 - Mo 15.12.08 14:22

user profile iconAgawain hat folgendes geschrieben Zum zitierten Posting springen:
hm

kann eigentlich kaum sein, es sei denn, sie ist nicht von TDataset abgeleitet.
RecordCount ist keine Methode, sondern ein nur Lese-Eigenschaft von TDataset.

Wüßte auch nicht, warum man der Kompo das klauen sollte.

Ja, stimmt. Is keine Methode. Sorry *g* Aber in meiner TSQL400-Komponenten hab ich das ned mit drin... Finds auch seltsam.


rob87 - Mo 15.12.08 14:24

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Dann bliebe noch die Möglichkeit, die Sortierung nach dem künstlichen Reihenfolgefeld (RF) umzudrehen und den ersten Datensatz auszulesen.

Daran dacht ich auch schon. Mein Ansatz:


Delphi-Quelltext
1:
2:
if SQL1.First then
  counter := StrToInt(SQL1.GetValue(1));  //Vorrausgesetzt natürlich dass, das SQL "richtig rum" sortiert ist.

Nur gibt es bei SQL-Komponente auch keine Methode "First" :roll: :roll:

Is alles ned so einfach *g*


Delete - Mo 15.12.08 14:25

Nach einem Open solltest Du eigentlich automatisch auf dem ersten Datensatz stehen.


rob87 - Mo 15.12.08 14:34

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Nach einem Open solltest Du eigentlich automatisch auf dem ersten Datensatz stehen.
Ja. Auch klar.
nur wenn ich ein Open oder ein Active := true mach, dann sitzt er zwar auch nach dem SQL auf dem ersten DS. Aber wenn ich drunter dann eine Variablen-Zuweisung dann nimmt er doch den letzten Datensatz oder? Oder neeee quatsch!
Er "öffnet die Ergebnismenge" und positioniert in an die erste Stelle. Genau, dann müssts passen.

Sorry, mein Denkfehler.

[Edit:] :lol: Fehlermeldungen über Fehlermeldungen *g* Muss des no gscheid zambasteln. *g*

[Edit:] Mit ', 2 as K' beginnende Zeichenkonstante nicht begrenzt. WTF ?? In Delphi gehts ned. Aber auf der Maschine wo die DB liegt gehts. *g*


Delete - Mo 15.12.08 14:46

Dabei kann ich Dir leider nicht helfen, da ich diese komische Kompo nicht kenne. Eine Google-Suche brachte eine polnische und eine italienische Seite zu Tage, beide Sprachen beherrsche ich nicht ;)


rob87 - Mo 15.12.08 14:48

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Dabei kann ich Dir leider nicht helfen, da ich diese komische Kompo nicht kenne. Eine Google-Suche brachte eine polnische und eine italienische Seite zu Tage, beide Sprachen beherrsche ich nicht ;)

Ich weiß. Hab auch schon danach gegoogelt. Aber mein Fehler war, dass in Delphi '' nicht zwei Hochkommas sind, sondern nur eins :D

[Edit:] Basst! Funzt alles! Merci