# Max-Wert einer Abfrage



## Frostie10 (31. August 2008)

Hallo 

Wie kann ich den höchsten Wert der aktuellen Abfrage ausgeben.

MIt 
	
	
	



```
Where datum = (select max(datum) from tabelle1)
```
 wird ja das höchste Datum der Tabelle1 ausgegeben. Aber ich möchte den höchsten Wert dieser Abfrage anzeigen lassen.
Also, ich habe eine normale Select-Abfrage z.B:

```
Select Name, Datum, Stelle from Tabelle1 where Name = 'Meyer' and ....
```


Diese Abfrage enthält nun mehere Datensätze mit unterschiedlichen Daten. Nun soll aus diesen Werten nur das höchste Datum angezeigt werden.

Wie stelle ich dies an?

Ich hoffe ihr könnt mir weiterhelfen...

Gruß
Frostie


----------



## kuddeldaddeldu (31. August 2008)

Hi,

wenn Du keine andere Sortierung brauchst, könntest Du nach dem Datum sortieren, oder Du ermittelst den höchsten Wert halt in der Schleife, die die Datensätze ausliest.

LG


----------



## Cojote (31. August 2008)

Select MAX(Datum) from Tabelle1 where Name = 'Meyer' and ....
GROUP BY 1

Gruppieren, danach aggregieren. Nach dem gruppieren kann man Aggregatfunktionen auf alle Spalten ausführen, man kann aber nur die Spalten selektieren die auch im GROUP BY vorkommen (in dem Fall jetzt gar keine)


----------



## Breit (31. August 2008)

Du hängst einfach 
	
	
	



```
ORDER BY datum LIMIT 1
```
 an`s Ende.

Dann wird nach dem Datum sortiert, aber es wird nur ein Datensatz geliefert
-> das ist dann der mit dem neustem oder ältestem Datum.


----------



## kuddeldaddeldu (31. August 2008)

Hi,

@Cojote: Das funktioiert so nicht. GROUP BY 1 bedeutet ja, gruppiere nach Spalte 1 (der selektierten), das wäre MAX(Datum) und danach kann natürlich nicht gruppiert werden.

LG


----------



## Cojote (1. September 2008)

@kuddeldaddeldu: Stimmt du hast recht. War gestern nicht ganz bei der Sache.


----------



## Saban (1. September 2008)

Hi Zusammen!

also ich hab das selbe Problem wie Frosti! ich würde auch gerne nur einen Datensatz ausgeben und zwar den niedrigsten. Ich glaub ob höchster oder niedrigster Datensatz ist kein Unterschied... Also ich geh so vor:

```
result = stmt.executeQuery(
"SELECT Artikel.ArtikelNr, Artikelpreis.ArtikelNr, Preis, von_Datum, bis_Datum, Artikelbezeichnung" +
"FROM Artikelpreis, Artikel" +
"WHERE Artikelpreis.ArtikelNr = Artikel.ArtikelNr" +
"AND von_Datum >= #01/01/2007#" +
"AND bis_Datum <= #31/12/2007#" +
"ORDER BY Preis DESC");
```

Nun ist des Problem das ich sortierte zwei Datensätze bekomme ich will jedoch nur den niedrigsten bekommen. Könnt ihr mir helfen?

MfG
Saban


----------



## shutdown (1. September 2008)

Könnte vielleicht irgendjemand von euch mal das verwendete DBMS mitteilen?
Nur so könnte man nämlich zielgerichtet helfen.

Ein 
	
	
	



```
LIMIT 0,1
```
 funktioniert nämlich nur in MySQL.
Unter Oracle würde man eine TopN-Analyse machen.
Und unter Informix würde man alles doppelt schreiben oder bitterlich weinen.

Helfen kann man euch hier nur, wenn ihr mal ein paar Infos gebt.


----------



## Saban (1. September 2008)

Hi!

tut mir leid das hab ich vergessen... Ich benutze eine Access DB!

MfG
Saban


----------



## shutdown (1. September 2008)

So wie das aussieht, gehst du ja nicht über eine "echte" Abfrage, sondern schießt das ganze über VBA rein. Das einfachste wäre da, wenn du die Sortierung in ASC umänderst und dann einfach bei der Weiterverarbeitung nur das erste ResultSet (das niedrigste) verarbeitest.


----------



## Saban (1. September 2008)

Hi!

ich mach des aber leider mit Java und soll des alles NUR mit SQL Statements lösen, ansonsten hätte ich alle results in ein Array geschrieben und da dann wie du gesagt hast nur das erste ausgegeben. Kann man die Ausgabe net irgendwie mit GROUP BY zusammenfassen? 

MfG
Saban


----------



## shutdown (1. September 2008)

Dann gibt es nur die Möglichkeit, die Abfrage in 2 Teile zu teilen

Original mit mehreren Werten

```
select WAS_ICH_WISSEN_WILL from TABELLEN where WAS_ERFÜLLT_SEIN_MUSS
```

Es wird nun ein Bindeglied BINDER eingeführt


```
SELECT WAS_ICH_WISSEN_WILL from TABELLEN where BINDER = (...)
AND WAS_ERFÜLLT_SEIN_MUSS
```

Und dieser Binder wird durch min() oder max() ermittelt


```
SELECT min(BINDER_SPALTE) from TABELLEN where WAS_ERFÜLLT_SEIN_MUSS
```


 Damit kommst du dann zu folgendem Endergebnis:


```
SELECT WAS_ICH_WISSEN_WILL from TABELLEN where BINDER = (
     SELECT min(BINDER_SPALTE) from TABELLEN where WAS_ERFÜLLT_SEIN_MUSS
) AND WAS_ERFÜLLT_SEIN_MUSS
```


----------



## Saban (1. September 2008)

Hey,

also ich habs jetzt so gemacht wie in deinem Post. Jetzt kommt bei mir aber die Fehlermeldung:

Sql.Exception: 1 Parameter wurde erwartet, aber es wurden zu wenig Parameter übergeben.

so frage ich ab:

```
while(result.next()){
System.out.println(result.getString("Artikelpreis.ArtikelNr") + ", " + result.getDouble("Preis") + ", " +
result.getDate("von_Datum") + ", " + result.getDate("bis_Datum") + ", " + result.getString("Artikelbezeichnung");}
```

MfG
Saban


----------



## shutdown (1. September 2008)

1. zu wenig Code
2. wahrscheinlich der falsche Code


----------



## Saban (2. September 2008)

Hi!

Also hier mein Code für die DB-Connection:
	
	
	



```
package AP2008_3;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class DB_Connection {
	static Connection con = null;
	static Statement stmt = null;
	
	public static void main(String [] args) throws SQLException, IOException{		
		DB_Tabellen tabelle = new DB_Tabellen();
		DB_Auslesen auslesen = new DB_Auslesen();
		
		System.out.println("\n");
		System.out.println("*** Verbindungsaufbau 'DB_Connection' ***");
		/* Laden des Datenbank Treibers */
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			System.out.println("Treiber: 'sun.jdbc.odbc.JdbcOdbcDriver' wurde geladen");
		} catch (ClassNotFoundException e) {
			System.err.println("Treiber-Klasse " + e + " konnte nicht geladen werden!");
			System.exit(0);
		}
		
		/* Aufbau der Verbindung */		
		try {
			con = DriverManager.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=D:\\Programm Files\\Toolz\\Programmieren\\Datenbanken\\DB_Vorlage_AP2008_3.mdb");
			System.out.println("--> Verbunden mit der Datenbank!");
			System.out.println();
		} catch (SQLException e) {
			System.err.println("Datenbank Verbindungsfehler ' " + e + " ' !");
			System.exit(0);
		}
		
		/* Anlegen eines Statement-Objekts */
		stmt = con.createStatement();
		
		/* Befüllen der Tabellen */
		System.out.println("*** Füllen der Tabellen ***");
		tabelle.fuelleTabArtikel(stmt);
		tabelle.fuelleTabArtikelPreis(stmt);
		tabelle.fuelleTabEinkauf(stmt);
		tabelle.fuelleTabEinkaufsPosition(stmt);
		tabelle.fuelleTabKunde(stmt);
		
		/* Transaktionsausführung bestätigen */
		con.commit();
		
		auslesen.minPreis2007(stmt);
		
		/** Verbindungsabbau **/
		con.close();
		System.out.println();
		System.out.println("*** Verbindungsabbau 'DB_Connection' ***");
		System.out.println();
		System.out.println();
	}
}
```

Hier der Code für das befüllen der Tabellen:
	
	
	



```
package AP2008_3;

import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DB_Tabellen {
	
	public DB_Tabellen() throws IOException{
		/** Überprüfung ob Datei bereits existiert **/
		String org_datei = "D:\\Programm Files\\Toolz\\Programmieren\\Datenbank Rohlinge\\DB_Vorlage_AP2008_3.mdb";
		String neu_datei = "D:\\Programm Files\\Toolz\\Programmieren\\Datenbanken\\DB_Vorlage_AP2008_3.mdb";
		
		File file = new File(neu_datei);
		
		if(file.exists() == true){
			file.delete();
			System.out.println("Datei '" + neu_datei + "' wurde gelöscht!");
			/* Startet die Konsole und Kopiert die Original Datei in den gewünschten Ordner */
			Runtime.getRuntime().exec("cmd /c copy \"" + org_datei + "\" \"" + neu_datei + "\"");
			System.out.println("Leere Datenbank wurde aus '" + org_datei + "' angelegt!");
		}else{
			Runtime.getRuntime().exec("cmd /c copy \"" + org_datei + "\" \"" + neu_datei + "\"");
			System.out.println("Leere Datenbank wurde aus '" + org_datei + "' angelegt!");
		}
	}
	
	public void fuelleTabArtikel(Statement stmt){
		/* String Arrays zum befüllen */
		String str_Artikel[] 	= new String[5];
		
		str_Artikel[0] 	= "('71835', 'Laptop')";
		str_Artikel[1] 	= "('71836', 'Desktop-PC')";
		str_Artikel[2] 	= "('71837', 'Taschenrechner')";
		str_Artikel[3] 	= "('71838', 'Block')";
		str_Artikel[4] 	= "('71839', 'Stift')";
		
		/* Schleife sollte nicht länger laufen wie der Eintrag ist
		 * --> Es sollen 3 Einträge gemacht werden aber das Array hat 5 Felder
		 * Folge: Es kommt zu Exception, da die Schleife 5x durchlaufen wird und ab dem 3x 'NULL' übergeben wird !NOT NULL! */
		try {
			for(int index = 0; index < str_Artikel.length; index++){
				stmt.executeUpdate("INSERT INTO Artikel VALUES " + str_Artikel[index]);
			}
			System.out.println("Daten wurden in 'Artikel' eingelesen");
		} catch (SQLException e) {
			System.err.println("Daten konnten in 'Artikel' nicht eingelesen werden!");
		}
	}
	
	public void fuelleTabArtikelPreis(Statement stmt){
		/* String Arrays zum befüllen */
		String str_ArtikelPreis[] 	= new String[6];
		
		str_ArtikelPreis[0] 	= "('44444', '71835', '01.09.2008', '01.09.2009', 1500)";
		str_ArtikelPreis[1] 	= "('55555', '71836', '11.09.2008', '11.09.2010', 700)";
		str_ArtikelPreis[2] 	= "('66666', '71837', '15.11.2007', '16.11.2007', 100)";
		str_ArtikelPreis[3] 	= "('66667', '71837', '15.11.2007', '16.11.2007', 50)";
		str_ArtikelPreis[4] 	= "('77777', '71838', '01.12.2008', '01.12.2009', 10)";
		str_ArtikelPreis[5] 	= "('88888', '71839', '15.11.2008', '15.11.2009', 5)";
		
		try {
			for(int index = 0; index < str_ArtikelPreis.length; index++){
				stmt.executeUpdate("INSERT INTO Artikelpreis VALUES " + str_ArtikelPreis[index]);
			}
			System.out.println("Daten wurden in 'Artikelpreis' eingelesen");
		} catch (SQLException e) {
			System.err.println("Daten konnten in 'Artikelpreis' nicht eingelesen werden!");
		}
	}
	
	public void fuelleTabEinkaufsPosition(Statement stmt){
		/* String Arrays zum befüllen */
		String str_EinkaufsPosition[] 	= new String[5];
		
		str_EinkaufsPosition[0] 	= "(1, '12345', '71835', 5, 2000)";
		str_EinkaufsPosition[1] 	= "(2, '23456', '71836', 1, 1200)";
		str_EinkaufsPosition[2] 	= "(3, '34567', '71837', 4, 150)";
		str_EinkaufsPosition[3] 	= "(4, '45678', '71838', 10, 25)";
		str_EinkaufsPosition[4] 	= "(5, '56789', '71839', 25, 15)";
		
		try {
			for(int index = 0; index < str_EinkaufsPosition.length; index++){
				stmt.executeUpdate("INSERT INTO Einkaufsposition VALUES " + str_EinkaufsPosition[index]);
			}
			System.out.println("Daten wurden in 'Einkaufsposition' eingelesen");
		} catch (SQLException e) {
			System.err.println("Daten konnten in 'Einkaufsposition' nicht eingelesen werden!");
		}
	}
	
	public void fuelleTabEinkauf(Statement stmt){
		/* String Arrays zum befüllen */
		String str_Einkauf[] 	= new String[5];
		
		str_Einkauf[0] 	= "('12345', '15', '01.01.2008', 500)";
		str_Einkauf[1] 	= "('23456', '22', '15.08.2008', 600)";
		str_Einkauf[2] 	= "('34567', '30', '01.11.2008', 700)";
		str_Einkauf[3] 	= "('45678', '35', '01.12.2008', 800)";
		str_Einkauf[4] 	= "('56789', '55', '22.01.2008', 900)";
		
		try {
			for(int index = 0; index < str_Einkauf.length; index++){
				stmt.executeUpdate("INSERT INTO Einkauf VALUES " + str_Einkauf[index]);
			}
			System.out.println("Daten wurden in 'Einkauf' eingelesen");
		} catch (SQLException e) {
			System.err.println("Daten konnten in 'Einkauf' nicht eingelesen werden!");
		}
	}
	
	public void fuelleTabKunde(Statement stmt){
		/* String Arrays zum befüllen */
		String str_Kunde[] 	= new String[5];
		
		str_Kunde[0] 	= "('15')";
		str_Kunde[1] 	= "('22')";
		str_Kunde[2] 	= "('30')";
		str_Kunde[3] 	= "('35')";
		str_Kunde[4] 	= "('55')";
		
		try {
			for(int index = 0; index < str_Kunde.length; index++){
				stmt.executeUpdate("INSERT INTO Kunde VALUES " + str_Kunde[index]);
			}
			System.out.println("Daten wurden in 'Kunde' eingelesen");
		} catch (SQLException e) {
			System.err.println("Daten konnten in 'Kunde' nicht eingelesen werden!");
		}
	}
}
```

Und hier für das Auslesen aus der DB:
	
	
	



```
package AP2008_3;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DB_Auslesen {
	
	private ResultSet result = null;
	
	public void minPreis2007(Statement stmt){
		try {
			result = stmt.executeQuery(
					" SELECT Artikelpreis.von_Datum, Artikelpreis.bis_Datum " +
					" FROM Artikelpreis " +
					" WHERE BINDER = ( " +
					" SELECT min(Artikelpreis.Preis), Artikelpreis.ArtikelNr FROM Artikelpreis " +
					" WHERE Artikelpreis.ArtikelNr = Artikel.ArtikelNr )" +
					" AND Artikelpreis.von_Datum >= #01/01/2007#" +
					" AND Artikelpreis.bis_Datum <= #31/12/2007#");
					
					/*
					" SELECT min(Artikelpreis.Preis), Artikelpreis.von_Datum, Artikelpreis.bis_Datum" +
					" FROM Artikelpreis " +
					" WHERE Artikelpreis.von_Datum >= #01/01/2007#" +
					" AND Artikelpreis.bis_Datum <= #31/12/2007#" +
					" AND Artikel.ArtikelNr = Artikelpreis.ArtikelNr");
					
					
					
					" SELECT Artikel.ArtikelNr, Artikelpreis.ArtikelNr, Preis, von_Datum, bis_Datum, Artikelbezeichnung" +
					" FROM Artikelpreis, Artikel" + 
					" WHERE Artikelpreis.ArtikelNr = Artikel.ArtikelNr" +
					" AND von_Datum >= #01/01/2007#" +
					" AND bis_Datum <= #31/12/2007#" + 
					" ORDER BY Preis DESC");*/
			
			System.out.println("\n\n");
			String str = "";
			while(result.next()){
				str = result.getString("Artikelpreis.ArtikelNr") + ", " + 
				result.getDouble("Preis") + ", " + result.getDate("von_Datum") + ", " +
				result.getDate("bis_Datum") + ", " + result.getString("Artikelbezeichnung");
			}
			
			System.out.println(str);
					
			System.out.println("Ausgabe des minimalen Preises des Jahres 2007");
		} catch (SQLException e) {
			System.err.println("Fehler beim auslesen des minimalen Preises des Jahres 2007! " + e);
		}		
	}
}
```

Die Fehlermeldung:
	
	
	



```
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Sie haben eine Unterabfrage erstellt, die mehr als ein Feld zurückgeben kann, ohne das reservierte Wort EXISTS im FROM-Abschnitt der Hauptabfrage zu verwenden. Überarbeiten Sie die SELECT-Anweisung der Unterabfrage, damit nur ein Feld abgerufen wird.
```

Mehr Code hab ich nicht 

MfG
Saban


----------



## shutdown (2. September 2008)

1. Mein BINDER war ein Platzhalter, damit die Lösung auch noch für andere Fälle nutzbar ist - ich versuche eigentlich immer zum nachdenken anzuregen, damit man den eigenen Code auch versteht, wenn man ihn von anderen bekommt. Wenn in deinen Tabellen nirgendwo die Spalte BINDER vorkommt, dürfte wohl klar sein, dass das nicht funktionieren kann, oder?

2. Ist die Fehlermeldung doch wohl sehr eindeutig. Da steht, dass die Unterabfrage mehr als ein Feld zurückgibt. Und Überraschung, genau das tut sie. Was könnte man also tun?
Richtig, die Unterabfrage so anpassen, dass nur noch ein Wert zurückgegeben wird.


```
" SELECT Artikelpreis.von_Datum, Artikelpreis.bis_Datum " +   
" FROM Artikelpreis " +
" WHERE Artikelpreis.Preis = ( " +                    
" SELECT min(Artikelpreis.Preis) FROM Artikelpreis " +                    
" WHERE Artikelpreis.ArtikelNr = Artikel.ArtikelNr )" +                    
" AND Artikelpreis.von_Datum >= #01/01/2007#" +                    
" AND Artikelpreis.bis_Datum <= #31/12/2007#");
```


----------



## Saban (2. September 2008)

Hi!

ja ok ich muss leider zugeben das das hochgradig dumm war auch wenn man grad erst mit dbs angefangen hat... TUT MIR LEID! ich war froh endlich ne Lösung zu haben.
Nun zu deiner Aussage das mehrere Parameter zurück kommen können! Ich sage doch wähle mir den minimal Preis aus, welches Zwischen dem Datum xx.xx.xx und xx.xx.xx liegt. Minimal Preis kann doch nicht mehr als einen minimal Preis zurück geben?

PS: Höchstwahrscheinlich lieg ich falsch würde mich also über deine Korrektur freuen!

MfG
Saban


----------



## shutdown (2. September 2008)

Also:
Dein Fehler bestand darin:

```
SELECT min(Artikelpreis.Preis), Artikelpreis.ArtikelNr FROM
```

Da stehen 2 Felder zwischen SELECT und FROM, folglich werden 2 Felder - nicht 1 - selektiert, daher die Fehlermeldung.

Die korrigierte Fassung findest du bereits im letzten Post.


----------



## Saban (2. September 2008)

Hi!

Danke der 2 Fehler ist mir nicht aufgefallen nun hab ich den Code folgendermaßen:
	
	
	



```
package AP2008_3;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DB_Auslesen {
	
	private ResultSet result = null;
	
	public void minPreis2007(Statement stmt){
		try {
			result = stmt.executeQuery(
					" SELECT Artikelpreis.von_Datum, Artikelpreis.bis_Datum " +
					" FROM Artikelpreis " +
					" WHERE Artikelpreis.Preis = ( " +
					" SELECT min(Artikelpreis.Preis) " +
					" FROM Artikelpreis " +
					" WHERE Artikelpreis.ArtikelNr = Artikel.ArtikelNr )" +
					" AND Artikelpreis.von_Datum >= #01/01/2007#" +
					" AND Artikelpreis.bis_Datum <= #31/12/2007#");
					
					/*
					" SELECT min(Artikelpreis.Preis), Artikelpreis.von_Datum, Artikelpreis.bis_Datum" +
					" FROM Artikelpreis " +
					" WHERE Artikelpreis.von_Datum >= #01/01/2007#" +
					" AND Artikelpreis.bis_Datum <= #31/12/2007#" +
					" AND Artikel.ArtikelNr = Artikelpreis.ArtikelNr");
					
					
					
					" SELECT Artikel.ArtikelNr, Artikelpreis.ArtikelNr, Preis, von_Datum, bis_Datum, Artikelbezeichnung" +
					" FROM Artikelpreis, Artikel" + 
					" WHERE Artikelpreis.ArtikelNr = Artikel.ArtikelNr" +
					" AND von_Datum >= #01/01/2007#" +
					" AND bis_Datum <= #31/12/2007#" + 
					" ORDER BY Preis DESC");*/
			
			System.out.println("\n\n");
			String str = "";
			while(result.next()){
				str = str + result.getString("Artikel.Artikelbezeichnung") + ", " + 
				result.getDouble("Artikelpreis.Preis") + ", " + result.getDate("Artikelpreis.von_Datum") + ", " +
				result.getDate("Artikelpreis.bis_Datum");
			}
			
			System.out.println(str);
					
			System.out.println("Ausgabe des minimalen Preises des Jahres 2007");
		} catch (SQLException e) {
			System.err.println("Fehler beim auslesen des minimalen Preises des Jahres 2007! " + e);
		}		
	}
}
```

Fehlermeldung:
	
	
	



```
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.
```

tut mir leid falls ich mich dumm anstelle... 

MfG
Saban


----------



## shutdown (2. September 2008)

Gibt dein SubSelect überhaupt ein Ergebnis zurück? (Einfach mal direkt in Access ausprobieren)

Ich behaupte nein, da du einen JOIN auf die Tabelle Artikel versuchst, ohne dass die Tabelle überhaupt genannt ist. Ist sie denn überhaupt notwendig?


----------



## Saban (2. September 2008)

Ja wenn ich es raus mach kommt zwar keine Fehlermeldung mehr aber ich habe dann auch keine Ausgabe mehr 
Es kommt dann einfach zu keiner Ausgabe mehr   

Edit:// Also er kommt nicht mal mehr in die while-Schleife rein und wenn ichs ohne while Schleife mache weil es ja nur einen Datensatz geben sollte kommt eine SQL Exception mit Column not found.

MfG
Saban


----------



## shutdown (2. September 2008)

Mach doch bitte einfach mal Access auf und teste, ob deine Queries (sowohl Sub, als auch das ganze) in Access direkt laufen würden.

Schalte jetzt einfach mal die Komponente Java aus und begib dich direkt an der Basis auf die Fehlersuche. Sollte da alles klappen, dann ist es eindeutig ein Java-Problem. Wenn nicht, dann ein SQL-Problem.


----------



## Saban (2. September 2008)

Hey!

Also die SQL Anweisung stimmt liegt irgendwie an Java danke! Muss jetzt halt schauen wie ich die Ausgabe hin bekomme...

Danke nochmal!

MfG
Saban


----------



## shutdown (2. September 2008)

Liegt vielleicht daran, dass du Daten abfrägst, die dir das Query überhaupt nicht bereitstellt:

```
str = str + result.getString("Artikel.Artikelbezeichnung") + ", " +           
 result.getDouble("Artikelpreis.Preis") + 
", " + 
result.getDate("Artikelpreis.von_Datum") + ", " +               
 result.getDate("Artikelpreis.bis_Datum");
```


----------



## Saban (2. September 2008)

Hi! 
also ich hab das Problem folgendermaßen gelöst.

```
public void ausAufgabe1(Statement stmt){
		try {
			result = stmt.executeQuery(
					" SELECT min(Artikelpreis.Preis) AS minPreis " +
					" FROM Artikelpreis, Artikel " +
					" WHERE Artikel.ArtikelNr = Artikelpreis.ArtikelNr " +
					" AND Artikelpreis.von_Datum >= #01/01/2007# " +
					" AND Artikelpreis.bis_Datum <= #31/12/2007# ");
			
			System.out.println();
			/* Ausgabe von Artikelbezeichnung funktionier nicht!? */
			while(result.next()){
				System.out.println("Der minimal Preis für ein Produkt des Jahres 2007 beträgt: " + result.getDouble("minPreis") + "€");
			}
			
			System.out.println("Ausgabe der Aufgabe 1");
		} catch (SQLException e) {
			System.err.println("Fehler beim auslesen der Aufgabe 1! " + e);
		}		
	}
```
ich glaube die Lösung ist akzeptabel... Ich habe zwar keine Ahnung wieso ich keine Artikelbezeichnung ausgeben kann aber das find ich schon auch noch raus...

Danke für eure Hilfe

MfG
Saban


----------



## shutdown (3. September 2008)

Du kannst mit Java doch nur weiterverarbeiten, was dir die Datenbank auch bereitstellt.
Was dir die Datenbank bereitstellt, ist im Normalfall das, was drin steht und das worum du sie bittest. Ich gehe jetzt mal davon aus, dass die Daten drin stehen.

Aber: Du frägst die Datenbank ja gar nicht danach:


```
SELECT Artikelpreis.von_Datum, Artikelpreis.bis_Datum FROM Artikelpreis
```

Da steht nirgendwo was von Artikelnummer oder Bezeichnung. Also kannst du 100 mal schreiben: 


```
result.getString("Artikel.Artikelbezeichnung")
```

Es wird nie etwas da sein, was du mit Java weiterverarbeiten könntest.

Also ist die einfachste Lösung, die Datenbank danach zu fragen.

Davon abgesehen, hat deine jetzige Lösung nichts mehr mit deiner ursprünglichen Fragestellung zu tun. Du wolltest den gesamten Datensatz, der dem Kriterium niedrigster Preis entspricht. Wie du das erreichen kannst, hab ich dir ja schon beschrieben.


----------



## Saban (3. September 2008)

Hi!

Also dieser Code entspricht nicht mehr dem in dem die Abfrage für die Artikelbezeichnung drin stand. Da hatte ich Artikelbezeichnung in der SELECT Anweisung schon eingefügt. 
Außerdem wollte ich von Anfang an mir den Artikel mit dem niedrigsten Preis bzw den niedrigsten Preis ausgeben lassen. Ich habe das ausprobiert der Code funktioniert einwandfrei und das einfacher wie mit SubSelects oder sonst was. Bitte versteh mich nicht falsch ich danke dir für deine Unterstützung aber der Code ist der den ich gesucht habe und er funktioniert! 


MfG
Saban


----------

