Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Select Frage zu Count(*) (https://www.delphipraxis.net/202868-select-frage-zu-count-%2A.html)

Trafel21 17. Dez 2019 10:47

Datenbank: firebird • Version: 2.5 • Zugriff über: Delphi XE

Select Frage zu Count(*)
 
Hallo zusammen,

ich wollte fragen ob es möglich ist die Anzahl der Zeilen einer Select Abfrage zusammen mit der ganzen Tabelle auszugeben?


Code:
Select
 count(*) as Test,
 Name,
 City
from Employee
Wie muss ich das Group by schreiben? Bei mir kommt immer ein "Invalid expression" Fehler. Ich möchte alle Namen und Städte ausgegeben haben, und als 3. Spalte die Anzahl der ganzen Zeilen, auch wenn sie bei jeder Zeile bei der Abfrage steht.

hoika 17. Dez 2019 10:53

AW: Select Frage zu Count(*)
 
Hallo,
wozu soll das Group By da helfen?

Mach mal ein Beispiel mit 3 Werten, also welche Werte in der Tabelle stehen und was rauskommen soll.

Select
(Select count(*) Employee E1 as Test),
E2.Name,
E2.City
from Employee E2

Das ergibt als Spalte 1 immer die Gesamtzahl der Zeilen (also der Einträge in der Tabelle Employee) und als Spalten 2/3 Name und Ort

mkinzler 17. Dez 2019 10:54

AW: Select Frage zu Count(*)
 
Entweder als Subselect oder einen Join

TigerLilly 17. Dez 2019 10:54

AW: Select Frage zu Count(*)
 
Ich bin nicht sicher, was du zählen möchtest.

Das da

Code:
Select
  count(*) as Test,
  Name,
  City
 from Employee
 Group by Name, city
liefert die Anzahl unterschiedlicher Einträge von City und Name.

TigerLilly 17. Dez 2019 10:56

AW: Select Frage zu Count(*)
 
Das da

Code:
Select
  (select count(*) from Employee) as anzahl,
  Name,
  City
 from Employee
liefert dir die Anzahl der Tabelle und dann jeden (auch doppelte) Einträge.

Trafel21 17. Dez 2019 11:17

AW: Select Frage zu Count(*)
 
Danke für die Antwort,

okay. Was ist wenn ich innerhalb einer Select Procedure bin mit 20 Eingabeparametern?

Wäre es auch möglich einfach das Suspend zu zählen? x.x

Code:
select
  DBDATE,
  DBUSER,
  DBKORRDATE,
  DBKORRUSER,
  .
  .
  .
  ITEM
from
  SELECT_PROCEDURE( :IN_ZULASSUNG, *hier stehen min 20 Parameter*)

TigerLilly 17. Dez 2019 11:47

AW: Select Frage zu Count(*)
 
Das ist ein bisschen im Trüben fischen. Kannst du genauer sagen, was du erzielen möchtest?

Die kurzen Antworten auf deine Fragen lauten:
* nicht viel
* ja

hoika 17. Dez 2019 11:58

AW: Select Frage zu Count(*)
 
Hallo,
Zitat:

Wäre es auch möglich einfach das Suspend zu zählen?
Ja, lokale Variable definieren

Counter=0;
For Select Into do
begin
Counter=Counter+1;
Suspend;
end;

Dann bekommst Du sowas wie
1 Halle
2 Berlin

Aber ohne mal eine klare Ausgabe, was konkret Du dir wünschst, sage ich nichts mehr ;)

mkinzler 17. Dez 2019 12:07

AW: Select Frage zu Count(*)
 
Dann ist der richtige Wert nur im letzen Datensatz.

Trafel21 17. Dez 2019 12:36

AW: Select Frage zu Count(*)
 
Ah... mit einem Counter hab hatte ich es versucht, aber hatte nicht die Logik bedacht, das es ja nur im letzten Datensatz steht.

Danke. ^^

Trafel21 17. Dez 2019 12:44

AW: Select Frage zu Count(*)
 
Zitat:

Zitat von hoika (Beitrag 1453610)
Hallo,
Zitat:

Wäre es auch möglich einfach das Suspend zu zählen?
Ja, lokale Variable definieren

Counter=0;
For Select Into do
begin
Counter=Counter+1;
Suspend;
end;

Dann bekommst Du sowas wie
1 Halle
2 Berlin

Aber ohne mal eine klare Ausgabe, was konkret Du dir wünschst, sage ich nichts mehr ;)

Ich wollte nur wissen wieviele Daten an Zeilen ausgegeben werden von der Procedure. Ich hatte den Counter davor schon drin,
hat nur nicht funktioniert, weil ich nicht bedacht hatte denn letzten Eintrack zu lokalisieren. Dataset.last und es funktioniert jetzt.

Rainbow6 17. Dez 2019 12:49

AW: Select Frage zu Count(*)
 
Hi,

also wenn ich es richtig sehe, dann versteht Firebird auch Window-Functions.

Wenn das so ist, dann sollte dir dieser SELECT das passende liefern:
Code:
SELECT
   COUNT(*) OVER() AS Anzahl,
   Name,
   City
FROM
   Employee
GROUP BY
   Name, City
Hab jetzt keinen Firebird da, aber im SQL-Server klappt das. Und Anzahl ist dann in jeder Zeile die Gesamt-Anzahl der Zeilen in der Tabelle - nicht die Anzahl der Zeilen in der GROUP BY Gruppe.

Und das ist wirklich das einfachste was man mit Window-Functions machen kann. Jeder der SQL verwendet sollte sich unbedingt auf der Website von Markus Winand (https://modern-sql.com/) umsehen - es gibt so viel mehr als SQL-92. Und jeder Self-JOIN auf diesem Planeten ist ein Self-JOIN zu viel.

HTH und Grüße
Daniel

hoika 17. Dez 2019 12:55

AW: Select Frage zu Count(*)
 
Hallo,
Zitat:

das es ja nur im letzten Datensatz steht.
Wenn du den Counter als Variable (also keine lokale Variable) übergibst, steht der Counter in jeder Zeile.

for select
Counter=1
Counter=Counter+1;

Counter an aufrufendes Select übergeben
Suspend;
end; // for select


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz