![]() |
Datenbank: Sqlite • Version: 3 • Zugriff über: Firedac
delphi 10 Sql Abfrage
Hallo liebe Spezialisten,
seit 3 Tagen versuche ich eine Abfrage zu erstellen :oops: Hintergrund: Sql Datenbank mit meheren Tabellen Tabelle 1: Stamm Felder u.a. Anzeigen Bsp: J Name Bsp: Wilhelm Mueller Tournr Bsp: 1 Tabelle Zwischen: Felder u.a. Wer Bsp: Wilhelm Mueller Tour Bsp: 2 Tageszahl Bsp: 20190725 Abfrage: Col1: Zeige Distinct Name aus Stamm Where Anzeigen ="J" and TourNr="2" Col2: Zähle alle Einträge in Zwischen (auch 0) where Tour="2" and Tageszahl zwischen 20190725 und 20190701 Ich hab mir die Augen wundgelesen und getestet ... ich kriege es nicht zusammen :oops: Könnte mir BITTE jemand weiter helfen ?:roll: |
AW: delphi 10 Sql Abfrage
Du musst wohl etwas konkreter werden.
Ein Stück Delphi Code, eine SQL Abfrage, eine Fehlermeldung, ... Wie sind Deine Delphikenntnisse? Wie sind Deine SQL Kenntnisse? (Wo darf man das Problem vermuten?) Ins Blaue hinein wirst Du keine hilfreiche Antwort erhalten. Wenn Du eine SQLITE Datei / Datenbank hast, ist der erste Hinweis: Nimm irgendein SQL Tool, das SQLITE spricht und mache die Abfrage darin, solange bis sie funktioniert. Wenn das bereits problematisch ist, kannst Du Dich auch dazu hier mit konkreten Fragen melden. |
AW: delphi 10 Sql Abfrage
Zitat:
Ich vermute mal, dass es um eine "Inner Join" Abfrage (oder ähnlich) geht. Um weiterhelfen zu können, muss Du uns mindestens folgende Daten liefern: - Die Struktur der involvierten Tabellen, zumindest die relevanten Tabellen und Feldnamen - Dein bisheriger SQL-Ansatz - Allfällige Fehlermeldungen Nur so kann festgestellt werden, ob z.B. Feldnamen unterschiedlich lauten oder die Abfrage grundsätzlich am falschen Ort ansetzt |
AW: delphi 10 Sql Abfrage
Zitat:
Und wenn Du überhaupt keinen blassen Schimmer hast, dann solltest Du das auch schreiben. Gruß K-H |
AW: delphi 10 Sql Abfrage
Zitat:
Aus Deiner Anforderung für die Abfrage geht hervor, dass Du die Daten aus 2 Tabellen kombinieren willst. Anhand welchen Feldes? Nicht mittels Name oder? Für sowas ist es gut, den Tabellenaufbau genau zu kennen. Nimm irgendein Tool und lese die Tabellen Create Statements aus und poste es hier. Wenn Du weiter an den Abfragen arbeitest: Versuche Teilergebnis- und wenn es nur eine Spalte ist- hinzukriegen. Man kann daraus Stück für Stück das Endergebnis bauen. Also reduzier die Komplexität, vergiß erstmal Delphi, nimm ein Datenbanktool und leg damit los. |
AW: delphi 10 Sql Abfrage
Dann muss ich es etwas genauer beschreiben.
Die Datenbank wurde nicht von mir erstellt. In der Tabelle Zwischen habe ich gegenüber der Frage oben das Feld Tageszahl durch die Felder Jahr und Woche_Nr eingesetzt. Database: [Stammdaten] Connection: read-write File name: E:\Abr\AbrDB\Stammdaten.db File size: 21176320 bytes Page size: 4096 Encoding: UTF-8 Table [Stamm] // Stammdaten mit Kunde und Fahrer soll alle aktiven Kunden von Tour 1 anzeigen (Tour 1 ist ein Fahrer) Felder: [anzeigen]: CHAR(1) // Kunde aktiv = J nicht aktiv = N [Name]: CHAR(30) // Kundenname [TourNr]: CHAR(1) // Nr. des Fahrers 1 bis 9 Table [zwischen] // Bewegungsdaten: Pro Besuch 1 Eintrag Fahrer (Tour) 1 war bei (Kunde) im (Jahr) 2019 in (Woche) 31 ...... Felder: [WER]: CHAR(30) // Kundenname aus Stamm [Tour]: CHAR(1) // entspr. Nr. des Fahrers [Jahr]: CHAR(4) // Beispiel: 2019 [Woche_Nr]: CHAR(4) // Beispiel: 31 Die Abfrage (in Delphi) soll folgendes zeigen: Alle aktiven Kunden von Tour 1 und die Anzahl der Besuche in der Woche 31 Aus Stamm / Aus Zwischen Kunde Besuche ************************* Schuster 1 Müller 0 Weber 2 Fleischer 0 Irgendwer 4 SchlagMichTot 1 ************************* order by Name Ich hoffe, dass diese Variante meiner Frage leichter zu verstehen ist. Irgendwie habe ich nur ein schwarzes Loch im Kopf, wenn ich versuche diese Abfrage zu erstellen - oder ich bin zu alt für sowas :wink: Danke für Eure Bemühungen ! |
AW: delphi 10 Sql Abfrage
Das
Code:
liefert die alle Touren für alle Kunden. Du willst aber etwas weniger:
select name from stamm s
join zwischen z on z.tour=s.tournr
Code:
Du willst aber nicht die Touren gelistet, sondern nur die Anzahl:
select name from stamm s
join zwischen z on z.tour=s.tournr where s.tour='1' and z.woche_nr='31'
Code:
Je nach DB-System musst du die Groß/Klein-Schreibung anpassen.
select Name, Count(*) from stamm s
join zwischen z on z.tour=s.tournr where s.tour='1' and z.woche_nr='31' group by z.woche, s.name Die Tabelle ist nicht von dir erstellt - wenn du trotzdem Feedback dazu haben willst, sag es. |
AW: delphi 10 Sql Abfrage
Die Woche muss da ins Group wohl nicht rein, stört aber vielleicht auch nicht.
Ob der Join überhaupt sein muss, wenn alle Daten in "Zwischen" stehen? Was ich zum Thema Arbeitserleichterung meinte: So ein Statement liefert die Tabellendefinition
Code:
Dann ist es nur noch copy/paste und im Forum kann das jeder verstehen.
SELECT name, sql FROM sqlite_master
WHERE type='table' and name = 'meineTabelle' ORDER BY name; |
AW: delphi 10 Sql Abfrage
Select distinct Name from Stamm
where Anzeigen = "J" and TourNr = "1" order by Name Liefert mir nur die aktuellen Kunden von TourNr 1 - genau das brauche ich ********************* Name Kalkm. Do Mitte1 Kalkm. Do Mitte2 Kalkm. Do Mitte3 Hammer Hagen Faltenb. Witten ********************** Jetzt soll hinter jedem Namen die Anzahl der Besuche aus Zwischen (auch Null) stehen, die von Tour 1 im Jahr 2019 und Woche 31 bei diesem Kunden waren. Select Count(*) as Anz from zwischen where Wer = (Name aus Stamm) !! and Jahr = "2019" and Woche_Nr = "31" and Tour = "1" ********************* Anz 1 1 0 4 2 ********************** Das alles in einer Abfrage sollte das Ergebnis bringen: ****************************** Name Anz Kalkm. Do Mitte1 1 Kalkm. Do Mitte2 1 Kalkm. Do Mitte3 0 Hammer Hagen 4 Faltenb. Witten 2 ******************************* die ich nicht zusammen bekomme. |
AW: delphi 10 Sql Abfrage
Die Vorschläge von Tiger Lilly hast Du schon gesehen?
Sein letzter solte eigentlich das ergeben was Du willst? Gruß K-H |
AW: delphi 10 Sql Abfrage
Ja, den Vorschlag habe ich etwas angepasst -
liefert aber Ergebnisse, die ich nicht zuordnen kann. select distinct Name, Count(*)as Anz from stamm s join zwischen z on z.tour=s.tournr where z.tour='1' and z.Jahr = "2019" and z.woche_nr='31' and s.Anzeigen = "J" group by z.woche_Nr, s.name ***************************** Name Anz Alphag 46 Witten Gieseke 46 Faltenb. Witten 46 Hammer Feinstahl 23 Kalkm. Bo Höntrop 46 Kalkm. Bo. Mitte 46 Kalkm. Do Hombruch 46 Kalkm. Do Hörde 46 Kalkm. Do Mitte 92 Kalkm. Düs. Mitte 46 ****************************** Da stehen Zahlen 23 bis 92 hinter ... das kann nicht sein ... Maximal 3 Besuche können es sein - es werden wohl alle Besuche angezeigt. Ich sag ja - Loch im Kopf - bei dieser Abfrage. Trotzdem DANKE für Eure Bemühung. |
AW: delphi 10 Sql Abfrage
Also wie bereits weiter oben geschrieben, was soll der join und das group by von woche_nr?
Was soll das Mischmasch mit ' und "? Wenn du weitere Angaben zu Deinem Datenmodell hättest, könnte man besser helfen. Was sind die Primärschlüssel-, was sind Fremdschlüssel Constraints? Bitte mal ausprobieren:
Code:
select wer, count(*) as Anz
from zwischen z where z.tour = '1' and z.Jahr = '2019' and z.woche_nr = '31' group by wer |
AW: delphi 10 Sql Abfrage
Das distinct ist unnötig, wenn du nach name gruppierst.
Schau dir doch mal an, was select * from stamm s join zwischen z on z.tour=s.tournr where z.tour='1' and z.Jahr = "2019" and z.woche_nr='31' and s.Anzeigen = "J" liefert, dann weisst du, warum andere Werte stehen als du erwartest. |
AW: delphi 10 Sql Abfrage
Herzlichen Dank an alle !
Jetzt habe ich es, dank Eurer Hilfe. Manchmal ist es eben so ... Brett vorm Kopf :roll: |
AW: delphi 10 Sql Abfrage
Prima!
Wie wär's wenn Du wie in einem Forum üblich, die Mitleser und Sucher teilhaben lässt, was das Problem bzw. die Lösung war? |
AW: delphi 10 Sql Abfrage
Nein, ich war zu schnell !
Es sah gut aus - der Fehler ist nur, ich brauche ALLE Kunden aus Stamm: Stamm: Select Distinct Name from Stamm where Anzeigen = "J" and TourNr = "1" order by Name Distinct deshalb, weil manche Kunden Mehrfach in der Liste stehen da sie mehrere Geräte zur Prüfung haben - ich will nur aber wissen ob der Fahrer (TourNr) in dieser Woche bei diesem Kunden war. Das steht in der Tabelle Zwischen, diese Sätze sollen gezählt und in einer Spalte hinter dem Namen stehen. Damit kann ich ermitteln ob der Fahrer ((Tour) in Zwischen) dort war oder bei 0 nicht dort war. Das Beispiel von JOBO: select wer, count(*) as Anz from zwischen z where z.tour = '1' and z.Jahr = '2019' and z.woche_nr = '31' group by wer zeigt mir NUR die besuchten Kunden - nicht die Kunden, wo er nicht war ! Ich brauche: Name AnzBesuche Kunde1 2 Kunde2 0 Kunde3 1 Kunde4 0 Kunde5 2 .... alle weiteren Kunden von Tour 1 Theoretische Lösung !!! Select Distinct Stamm.Name AS Kunde where Stamm.Anzeingen = "J" and Stamm.TourNr = "1" PLUS Count(Zwischen.*) where Zwischen.Jahr ="2019" and Zwischen.Woche ="32" and Zwischen.Tour = (Stamm.TourNr) und das auch MIT einer 0 Tut mir leid - ich weiss nicht wie ich es anders beschreiben soll. |
AW: delphi 10 Sql Abfrage
Dann nimm statt des JOINS einen LEFT OUTER JOIN
Oder du macht aus der COUNT(*) eine Subquery. select wer, (select count(*) from zwischen z where z.tour = s.tour and .... ) as Anzahl from stamm s where ..... |
AW: delphi 10 Sql Abfrage
Das war´s !!! :-D
Der Tip von TigerLilly bringt genau das, was ich 3 Tage gesucht habe. DIE LÖSUNG IST ! select Name, (select count(*) from zwischen z where z.tour = s.tourNr and z.wer = s.Name and Jahr ="2019" and Woche_Nr = "31" ) as Anzahl from stamm s where s.anzeigen = "J" and s.TourNr = "1" DANKE DANKE DANKE Mit 65 schaltet, bei zu langer Betrachtung, das Gehirn auf (Alles ist grau) bei mir jedenfalls. Eine Subquery !!!! :pale::stupid: |
AW: delphi 10 Sql Abfrage
mit [ CODE=sql]....SQLTEXT..[ /CODE] (ohne die Leerzeichen)sind Deine Abfragen etwas besser zu lesen.
Gruß K-H |
AW: delphi 10 Sql Abfrage
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 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