Autor |
Beitrag |
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 01.10.08 10:15
D. Annies hat folgendes geschrieben : | [...] 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
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Mi 01.10.08 12:35
Vielleicht solltest du die Datenstruktur ändern?
Ich würde folgende Struktur empfehlen:
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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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  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
|
Verfasst: Mi 01.10.08 19:04
OK, Teil 1:
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| SELECT B.KLASSE, Count(1) As 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:
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8: 9:
| UNION SELECT 'Gesamt', Count(1) AS 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):
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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mi 01.10.08 19:46
Hi, Deddy, genau so will ich die Ausgabe haben !!!
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
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 01.10.08 19:47
DeddyH hat folgendes geschrieben : | [...] Mit UNION kannst Du 2 Teilabfragen vereinen, [...] |
Vorausgesetzt, das (R)DBMS unterstützt es.
|
|
Robert.Wachtel
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 01.10.08 19:49
D. Annies hat folgendes geschrieben : | [...] 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
|
Verfasst: Mi 01.10.08 19:50
Klar, Du hast 2 Format-Platzhalter, gibst aber nur ein Argument an.
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
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 01.10.08 19:55
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 01.10.08 19:56
Aber verständlicher als die Index-Lösung 
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mi 01.10.08 20:10
Hi, ihr 2,
jetzt habe ich:
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
|
Verfasst: Mi 01.10.08 20:15
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
      
Beiträge: 895
Erhaltene Danke: 7
Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
|
Verfasst: Mi 01.10.08 20:25
Du immer mit Deinen unnötigen Redundanzen...
Wetten, dass die Fehlermeldung bleibt? ;D
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 01.10.08 20:30
Wenn die oben gepostete Datenstruktur stimmt, warte ich einfach mal ab.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mi 01.10.08 22:05
Hi, Kämpfer (aber lachen könnt ihr ja auch...)
wahrscheinlich geht es eleganter:
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
|
|