Autor Beitrag
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.09.08 19:34 
Die 1 und 2 sind Konstanten für das künstliche Feld "RF" (für Reihenfolge), d.h. die Ergebnismenge soll die gruppierten Datensätze ausgeben und zum Schluss die Gesamtanzahl.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 30.09.08 20:10 
Hallo Robert und Deddy,

ich denke, ich mache morgen weiter, bin irgendwie zu müde - ich melde mich wieder!!

Danke erstmal,
Detlef

_________________
ut vires desint, tamen est laudanda voluntas
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mi 01.10.08 09:00 
Hi,

so, da bin ich wieder. Noch einmal zur Sicherheit: Ich will nicht die einzelnen Personen wissen. Beispielsweise: 10a hat das Buch 25 mal und 10b hat es 23 mal. Dann möchte ich auch (nur per showmessage) ausgeben, dass es insgesamt 48 mal ausgeliehen ist. Meine beiden Codeschnipsel habe ich auch schon angegeben, sie funktionieren auch so für sich.

Aber wie geht es in einem SQL-Befehl?

Danke, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.10.08 09:08 
Hallo Namensvetter,
ich habe ja Deine Datenstruktur nicht, aber versuch doch mal meinen SQL-Befehl von Seite 1 und schau Dir das Ergebnis an. Die künstliche Spalte "RF" musst Du dabei ja nicht im Programm anzeigen. Sollte das so nicht passen, muss man das Ganze halt nochmal überdenken. Falls doch, erklär ich es Dir gerne auch im Detail ;)
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Mi 01.10.08 10:15 
user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
[...] so, da bin ich wieder. Noch einmal zur Sicherheit: Ich will nicht die einzelnen Personen wissen. Beispielsweise: 10a hat das Buch 25 mal und 10b hat es 23 mal. Dann möchte ich auch (nur per showmessage) ausgeben, dass es insgesamt 48 mal ausgeliehen ist. Meine beiden Codeschnipsel habe ich auch schon angegeben, sie funktionieren auch so für sich. [...]

Gibt es irgendeinen Grund, warum Du uns die Tabellenstruktur nicht erläutern willst?
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mi 01.10.08 12:35 
Vielleicht solltest du die Datenstruktur ändern?

Ich würde folgende Struktur empfehlen:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Buch
+- ID
+- Titel
+- ISBN

Klasse
+- ID
+- Jahrgang
+- Zusatz

Buch_Klasse
+- Buch_ID
+- Klasse_ID
+- Anzahl


So kannst du in der Zuordnung Buch_Klasse feststellen, wie oft das Buch in welcher Klasse vorhanden ist und bei einem Verlust/einer Neuanschaffung, etc. pp. den Wert ändern.

Wenn du nun herausfinden willst, wie oft Buch X ausgeliehen ist, machst du eine Summer über das Feld Anzahl der [code}Buch_Klasse[/code]-Tabelle anhand der Buch ID.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mi 01.10.08 18:05 
Hi, Robert,

tschuldige, wenn ich die Tabellenstruktur erst jetzt nachliefere:

TITEL NAME VORNAME KLASSE LEIHDAT

also, noch nicht einmal mit einer ID - aber diese Struktur musste ich leider übernehmen!

Gruß, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mi 01.10.08 18:53 
Hi, DeddyH,

so, nun habe ich deinen Befehl auch eingegeben, leider funktioniert er nicht.

Fehlermeldung Syntax ... beim zweiten mal Dateiname als Übergabeparameter "%s"

also, ich habe nichts gegen eine Erklärung :D zum Bleistift auch count (1) from; ich kenne bisher nur count(*) from

Gruß, DEtlef

_________________
ut vires desint, tamen est laudanda voluntas
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.10.08 19:04 
OK, Teil 1:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
SELECT 
  B.KLASSE,
  Count(1As Anzahl, 1 AS RF
FROM
  Tabelle As B
WHERE
  B.Name <> '' AND
  B.Titel = 'irgendwas'
GROUP BY
  B.Klasse


Beim Count ist es egal, welches Feld Du nimmst, bei Verwendung einer Konstanten (in meinem Fall eben 1) ist das Ganze einen Tick performanter, da der Feldinhalt gar nicht erst ausgelesen werden muss. Die "1 AS RF" ist wie schon gesagt ein künstliches Feld für die spätere Sortierung.

Teil 2:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
UNION
  SELECT
    'Gesamt',
    Count(1AS Anzahl, 2 AS RF
  FROM Tabelle 
  WHERE
    Name <> '' AND
    Titel = 'irgendwas'
ORDER BY RF, B.Klasse

Mit UNION kannst Du 2 Teilabfragen vereinen, solange diese die gleichen Feldtypen in der gleichen Reihenfolge zurückgeben. Das "Gesamt" ist hier wieder eine Konstante, damit das Abfrageergebnis hübsch aussieht. Das künstliche Feld RF hat nun den Wert 2, damit der Datensatz bei entsprechender Sortierung auf jeden Fall als Letzter gelistet wird.
Zum Schluss wird mit ORDER BY noch erst nach RF und dann nach Klasse sortiert. Gedachtes Abfrageergebnis ist (Beispiel):
ausblenden Quelltext
1:
2:
3:
4:
5:
Klasse    Anzahl   RF
10b       10       1
3a        15       1
5d        10       1
Gesamt    35       2


Zeig doch mal, wie Du versucht hast ihn einzubauen, evtl. liegt es ja nur am "Format"-Befehl.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mi 01.10.08 19:46 
Hi, Deddy, genau so will ich die Ausgabe haben !!!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
SQL.Text := format('SELECT B.KLASSE, Count(1) As Anzahl, 1 AS RF ' +
                         'FROM "%s" ' +
                         'WHERE Name <> '' AND Titel = :BAkt ' +
                         'GROUP BY Klasse ' +
                         'UNION ' +
                         'SELECT Count(1) AS Anzahl, 2 AS RF ' +
                         'FROM "%s" ' +
                         'WHERE Klasse <> '' AND Titel = :BAkt ' +
                         'ORDER BY RF, Klasse ', [TbBuecher.tablename]);
        Parambyname('BAkt').asstring := QBuchstamm.fieldbyname('TITEL').asstring;


die Fehlermeldung ist: Kein Argument für '%s'

Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Mi 01.10.08 19:47 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
[...] Mit UNION kannst Du 2 Teilabfragen vereinen, [...]

Vorausgesetzt, das (R)DBMS unterstützt es.
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Mi 01.10.08 19:49 
user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
[...] die Fehlermeldung ist: Kein Argument für '%s' [...]

Da Du zwei Platzhalter mit dem selben Parameter belegen willst musst Du diese natürlich qualifizieren.

Setze also anstatt %s mal %0:s.

Näheres siehe in der Online-Hilfe beim Thema Format-Strings.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.10.08 19:50 
Klar, Du hast 2 Format-Platzhalter, gibst aber nur ein Argument an.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
SQL.Text := format('SELECT B.KLASSE, Count(1) As Anzahl, 1 AS RF ' +
                         'FROM "%s" ' +
                         'WHERE Name <> '' AND Titel = :BAkt ' +
                         'GROUP BY Klasse ' +
                         'UNION ' +
                         'SELECT Count(1) AS Anzahl, 2 AS RF ' +
                         'FROM "%s" ' +
                         'WHERE Klasse <> '' AND Titel = :BAkt ' +
                         'ORDER BY RF, Klasse ', [TbBuecher.tablename,TbBuecher.tablename]);
        Parambyname('BAkt').asstring := QBuchstamm.fieldbyname('TITEL').asstring;
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Mi 01.10.08 19:55 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
[...]
ausblenden Delphi-Quelltext
1:
2:
3:
[...]
[TbBuecher.tablename,TbBuecher.tablename]);
[...]

Das ist aber jetzt durch die Brust ins Auge, findest Du nicht? :mrgreen:
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.10.08 19:56 
Aber verständlicher als die Index-Lösung ;)
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mi 01.10.08 20:10 
Hi, ihr 2,

jetzt habe ich:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
SQL.Text := format('SELECT B.KLASSE, Count(1) As Anzahl, 1 AS RF ' +
                         'FROM "%0:s" ' +
                         'WHERE Name <> '''' AND Titel = :BAkt ' +
                         'GROUP BY Klasse ' +
                         'UNION ' +
                         'SELECT "gesamt", Count(1) AS Anzahl, 2 AS RF ' +
                         'FROM "%0:s" ' +
                         'WHERE Klasse <> '''' AND Titel = :BAkt ' +
                         'ORDER BY RF, Klasse ', [TbBuecher.tablename]);
        Parambyname('BAkt').asstring := QBuchstamm.fieldbyname('TITEL').asstring;


mit der Fehlermeldung: Ungültiger Feldname Klasse'

Wir schaffen das!
Detlef
(besser gesagt: Ihr schafft das)

_________________
ut vires desint, tamen est laudanda voluntas
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.10.08 20:15 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
SQL.Text := format('SELECT B.KLASSE, Count(1) As Anzahl, 1 AS RF ' +
                         'FROM "%s" B ' +
                         'WHERE Klasse <> '''' AND Titel = :BAkt ' +
                         'GROUP BY Klasse ' +
                         'UNION ' +
                         'SELECT "gesamt", Count(1) AS Anzahl, 2 AS RF ' +
                         'FROM "%0:s" ' +
                         'WHERE Klasse <> '''' AND Titel = :BAkt2 ' +
                         'ORDER BY RF, B.Klasse ', [TbBuecher.tablename]);
Parambyname('BAkt').asstring := QBuchstamm.fieldbyname('TITEL').asstring;
Parambyname('BAkt2').asstring := QBuchstamm.fieldbyname('TITEL').asstring;

Irgendwann klappt das schon *g*
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Mi 01.10.08 20:25 
Du immer mit Deinen unnötigen Redundanzen... :mrgreen:

Wetten, dass die Fehlermeldung bleibt? ;D
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.10.08 20:30 
Wenn die oben gepostete Datenstruktur stimmt, warte ich einfach mal ab.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mi 01.10.08 22:05 
Hi, Kämpfer (aber lachen könnt ihr ja auch...)

wahrscheinlich geht es eleganter:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
format('SELECT KLASSE, Count(*) As Anzahl ' +
                         'FROM "%s" ' +
                         'WHERE Name <> '''' AND Titel = :BAkt ' +
                         'GROUP BY Klasse ', [TbBuecher.tablename]) +
                  format('UNION ' +
                         'SELECT "zusam", Count(*) AS Anzahl ' +
                         'FROM "%s" ' +
                         'WHERE Klasse <> '''' AND Titel = :BAkt ' +
                         'ORDER BY Klasse ', [TbBuecher.tablename]);
        Parambyname('BAkt').asstring := QBuchstamm.fieldbyname('TITEL').asstring;


aber so geht es erstmal!

Grüße aus Lübeck,
Detlef

_________________
ut vires desint, tamen est laudanda voluntas