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
DeddyH hat folgendes geschrieben : |
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
rob87 - Mo 15.12.08 13:04
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); |
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 ;-)
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
Agawain hat folgendes geschrieben : |
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
DeddyH hat folgendes geschrieben : |
| 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)); |
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
DeddyH hat folgendes geschrieben : |
| 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
DeddyH hat folgendes geschrieben : |
| 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!