Saban Geschrieben 28. August 2008 Geschrieben 28. August 2008 Mahlzeit! Ich habe eine Access Datenbank in der ich 7 Tabellen habe. Ich muss jetzt die Kosten für ein Projekt ermitteln das Problem ist jedoch, das ich die Lohnerhoehungen mit einbeziehen muss und das alles mit SQL Statements. Könnte mir jemand helfen wie ich des hinkriegen könnte... Also meine Tabellen sind: - Kosten (Von, Bis, Lohngruppe, Std) - Besuchte Abteilungen (AbteilungsNr, PersonalNr, Von, Bis) - Abteilungen (AbteilungsNr, Abteilung) - laufProjekte (ProjektID, PersonalNr, Stunden, Datum) - Lohnerhoehung (PersonalNr, Erhoehung, Datum) - Mitarbeiter (PersonalNr, Name, Vorname, Geburtstag, Straße, Plz, Ort, Aktiv, Lohngruppe, AbteilungsID) - Proejtke (Projekt, ProjektID) Kosten = Stunden für das Angefallene Projekt * den StdSatz der jeweiligen Lohngruppe (einschließlich der Lohnerhoehungen) Die jeweilige Lohngruppe wird durch das Datum bei den laufProjekten definiert. Also laufProjekte.Datum muss zwischen Kosten.Von und Kosten.Bis liegen dann hat man die Lohngruppe. Ich sollte vllt dazu sagen das es meine erste DB ist und ich mich durch diese Aufgabe in DBs einarbeiten soll. Ich weiß zwar wie ich es machen muss aber keine Ahnung wie ich des mit SQL umsetzen kann... MfG Saban Zitieren
flashpixx Geschrieben 28. August 2008 Geschrieben 28. August 2008 Nimm Dir ein Buch für SQL, wo der Sprachsyntax erläutert ist. Dir hier alle Details und evtl auch eine fertige Lösung zu liefern, ist sicherlich nicht so ganz gewünscht. Außerdem fehlen in Deinem Post die Informationen zu den Beziehungen der Tabellen. Generell benötigst Du aus dem SQL Syntax: Select, um die Datensätze zu holenJoin um die Tabellen zu verknüpfenWhere mit between um die Datensätze "von / bis" zu suchenevtl Subselectssum um über Datenfelder zu summieren Ich interpretiere Deinen letzten Satz als eine "Art Hausaufgabe" und somit solltest Du Dich selbst einarbeiten. Mein Tip: Beginne mit einer Tabelle, die Dir die Stunden über ein Projekt summiert, formuliere den Select in der Form, dass er nur ein Datenfeld mit der Gesamtstundenzahl liefert HTH Phil Zitieren
Saban Geschrieben 28. August 2008 Autor Geschrieben 28. August 2008 Hey flashpix! also ich habe mich schon in Befehle wie SELECT, BETWEEN, SUM oder ähnliches eingearbeitet. Das Problem ist nur das ich jetzt ne Addition über 2 Tabellen durchführen muss das Ergebnis dann mit Summe der Std multiplizieren muss und ich keine Ahnung habe wie das per SQL Statement gehen soll. Ich habe es eigentlich so gelöst gehabt: try { result = stmt.executeQuery( " SELECT * FROM Kosten, Mitarbeiter, laufProjekte, Projekte"+ " WHERE Projekte.Projekt = '" + projekt + "'" + " AND Projekte.ProjektID = laufProjekte.ProjektID" + " AND laufProjekte.Datum >= Kosten.Von" + " AND laufProjekte.Datum <= Kosten.Bis" + " AND laufProjekte.PersonalNr = Mitarbeiter.PersonalNr" + " AND Mitarbeiter.Lohngruppe = Kosten.Lohngruppe"); while(result.next()){ stunden = result.getInt("Stunden"); satz = result.getInt("StdSatz"); summe = summe + satz * stunden; } area.append("Die Kosten für dieses Projekt betragen " + summe + "€"); area.append("\n"); System.out.println("Ausgabe der Kosten für das Projekt '" + projekt + "'"); } catch (SQLException e) { System.err.println("Fehler beim auslesen der Kosten von '" + projekt + "'!"); } Aber das passte meinem Ausbilder nicht, da er meinte ich soll keine Java Variablen benutzen. Kann mir sonst noch jemand irgendwie helfen Edit: \\ Ich sollte dazu das das noch die alte Tabellen Struktur war jetzt hab ich bei laufProjekten nur noch ein 'Datum' statt 'Von' und 'Bis' MfG Saban Zitieren
dr.dimitri Geschrieben 28. August 2008 Geschrieben 28. August 2008 Aber das passte meinem Ausbilder nicht, da er meinte ich soll keine Java Variablen benutzen Da hat er schon recht. Programmiere nichts nach, was Du auch in SQL machen kannst. Zu allererst solltest Du auch auf das SELECT * verzichten. Nimm nur die Spalten die Du auch wirklich brauchst. Ansonsten wird das nichts. Und jetzt einfach deine Formel in SQL schreiben: SELECT SUM(satz * stunden) AS KOSTEN Ergiebt dann genau eine Spalte namens KOSTEN die dir dein Ergebnis liefert. Dim Zitieren
flashpixx Geschrieben 28. August 2008 Geschrieben 28. August 2008 Mist, schon wieder zu langsam, aber genau das wollte ich auch vorschlagen Phil Zitieren
TDM Geschrieben 28. August 2008 Geschrieben 28. August 2008 (bearbeitet) Und jetzt einfach deine Formel in SQL schreiben: SELECT SUM(satz * stunden) AS KOSTEN Ergiebt dann genau eine Spalte namens KOSTEN die dir dein Ergebnis liefert. Wenn er von Kosten und laufProjekte selektiert, muss er noch die Spalte an der Tabelle spezifizieren, da beide eine Spalte "std" haben. [Editerle] Ahh, verlesen, bei dem anderen heißts Stunden. :floet: Bearbeitet 28. August 2008 von TDM Zitieren
dr.dimitri Geschrieben 28. August 2008 Geschrieben 28. August 2008 Wenn er von Kosten und laufProjekte selektiert, muss er noch die Spalte an der Tabelle spezifizieren, da beide eine Spalte "std" haben. Na die genaue Umsetzung überlass ich mal dem Kollegen. :cool: Würds sowieso erst direkt in Access probieren bevor ich das ganze dann hartcodiert (!!) in eine Javanawendung packe. Dim Zitieren
Saban Geschrieben 28. August 2008 Autor Geschrieben 28. August 2008 Hi! Des hatte ich auch schon. Da ist jetzt des Problem das ich die 'Standart' Kosten erhalte, das heißt es werden die Lohnerhoehungen nicht berücktsichtigt. Ich muss erst mal schauen ob der Angestellte Lohnerhoehungen erhalten hat anschließenden das Datum des Projekts mit der der Lohnerhoehung vergleichen und wenns vor dem Projekt war zu dem StdSatz des Angestellten dazu zählen und erst dann multiplizieren das ist mein eigentliches Problem. Tut mir leid falls euch der vorherige Post irritiert hat ich wollte nur zeigen das ich schon was gemacht hab... MfG Saban Zitieren
dr.dimitri Geschrieben 28. August 2008 Geschrieben 28. August 2008 In diesem Fall sind das ja mehrere getrennte Berechnungen. Schreib für jeden Fall ein eigenes SQL und füg die Ergebnisse per UNION ALL zusammen: SELECT sum(ergebnis) as gesamtergebnis FROM( select sum.... AS ERGEBNIS FROM... UNION ALL select sum ... AS ERGEBNIS FROM ... ) Dim Zitieren
TDM Geschrieben 28. August 2008 Geschrieben 28. August 2008 Würds sowieso erst direkt in Access probieren bevor ich das ganze dann hartcodiert (!!) in eine Javanawendung packe. So gern ich auch selber seitenweise SQL-Anweisungen in meinem Quellcode hab, wieso hardcodieren und nicht als Access-Query? (Wenns zynisch gemeint war, dann ok ) Zitieren
dr.dimitri Geschrieben 28. August 2008 Geschrieben 28. August 2008 (Wenns zynisch gemeint war, dann ok Das war's durchaus :beagolisc SQLs gehören eigentlich in eine eigene Datenbanktabelle und das SQL um sie zu laden in eine properties Datei o.ä. Aber bei einer solchen Übungsaufgabe sollte es erstmal egal sein. wieso hardcodieren und nicht als Access-Query? Musste zum Glück schon lang nichts mehr mit Access machen, aber wie kann man die dann per JDBC abrufen? Dim Zitieren
TDM Geschrieben 28. August 2008 Geschrieben 28. August 2008 Musste zum Glück schon lang nichts mehr mit Access machen, aber wie kann man die dann per JDBC abrufen? Da muss ich zum Glück (oder Pech) sagen, dass ich lange nicht mehr mit Java/JDBC zu tun hatte. Bei C#/ODBC behandelt man das aber als storedprocedur. Ich meine mich zu entsinnen, dass es mit Java ähnlich geht, wobei Access irgendwo der Plattformunabhängigkeit von Java widerspricht. Zitieren
dr.dimitri Geschrieben 28. August 2008 Geschrieben 28. August 2008 Ich meine mich zu entsinnen, dass es mit Java ähnlich geht, Das wär dann wohl über ein CallableStatement. wobei Access irgendwo der Plattformunabhängigkeit von Java widerspricht. Wieso? Win2000, WinXP, Win2003, Win2008, Vista bald Win7. Reicht das nicht? Dim Zitieren
TDM Geschrieben 28. August 2008 Geschrieben 28. August 2008 Das wär dann wohl über ein CallableStatement. Ja, aber wenn mit Parametern, dann sicher PreparedStatement. Wieso? Win2000, WinXP, Win2003, Win2008, Vista bald Win7. Reicht das nicht? Linux, Unix? Ich wäre hier mehr für SQL-lite. Zitieren
dr.dimitri Geschrieben 28. August 2008 Geschrieben 28. August 2008 Ja, aber wenn mit Parametern, dann sicher PreparedStatement. Nö. Wenn es wie eine StoredProcedure behandelt wird, dann nicht. Entweder das eine oder das andere. Beide erlauben die übergabe von Parametern, aber der Rückgabewert wird anders behandelt. Bei einem CallableStatements per OUT Parameter, bei einem preparedStatement ist es ein ResultSet. Wobei auch ein CallableStatement ein ResultSet liefern kann. Linux, Unix? Auch das war zynisch gemeint. :upps Ich wäre hier mehr für SQL-lite. Ich wär für eine Oracle XE Installation, dann lernt er wenigstens mal was eine richtige DB ist. Dim Zitieren
Saban Geschrieben 29. August 2008 Autor Geschrieben 29. August 2008 Morgen! Des mit den einzelnen Ergebnissen bringt mich zwar schon meinem Ziel näher aber da ist nix mit IF-Abfragen drin. Wie baue ich ne IF-Abfrage in das SELECT mit ein? Muss ja noch das Datum vergleichen bevor ich die Lohnerhoehung mit dem StdSatz addiere... MfG Saban Zitieren
TDM Geschrieben 29. August 2008 Geschrieben 29. August 2008 Morgen! Des mit den einzelnen Ergebnissen bringt mich zwar schon meinem Ziel näher aber da ist nix mit IF-Abfragen drin. Wie baue ich ne IF-Abfrage in das SELECT mit ein? Muss ja noch das Datum vergleichen bevor ich die Lohnerhoehung mit dem StdSatz addiere... MfG Saban WHERE. Wobei if-Abfragen nicht wie in Java behandelt werden, SQL ist keine Programmier- sondern eine Abfragesprache. Nö. Wenn es wie eine StoredProcedure behandelt wird, dann nicht. Entweder das eine oder das andere. Beide erlauben die übergabe von Parametern, aber der Rückgabewert wird anders behandelt. Bei einem CallableStatements per OUT Parameter, bei einem preparedStatement ist es ein ResultSet. Wobei auch ein CallableStatement ein ResultSet liefern kann. Ok, wie gesagt; lang nichts mehr mit Java gemacht. Zitieren
dr.dimitri Geschrieben 29. August 2008 Geschrieben 29. August 2008 WHERE. Wobei if-Abfragen nicht wie in Java behandelt werden, SQL ist keine Programmier- sondern eine Abfragesprache. Es gibt aber auch Bedingungen die man in die SELECT Klausel selbst einbauen kann. In Oracle verwendet man dazu entweder CASE oder DECODE. Ich weiß nicht wie das Schlüsselwort bei Access lautet. Dim Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.