Max-Wert einer Abfrage

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
 
Dann gibt es nur die Möglichkeit, die Abfrage in 2 Teile zu teilen

Original mit mehreren Werten
SQL:
select WAS_ICH_WISSEN_WILL from TABELLEN where WAS_ERFÜLLT_SEIN_MUSS

Es wird nun ein Bindeglied BINDER eingeführt

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

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

SQL:
SELECT min(BINDER_SPALTE) from TABELLEN where WAS_ERFÜLLT_SEIN_MUSS


Damit kommst du dann zu folgendem Endergebnis:

SQL:
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
 
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:
Java:
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
 
Zuletzt bearbeitet von einem Moderator:
Hi!

Also hier mein Code für die DB-Connection:
Java:
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:
Java:
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:
Java:
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:
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
 
Zuletzt bearbeitet von einem Moderator:
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.

Java:
" 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#");
 
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
 
Also:
Dein Fehler bestand darin:
Code:
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.
 
Hi!

Danke der 2 Fehler ist mir nicht aufgefallen nun hab ich den Code folgendermaßen:
Java:
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:
 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... :confused:

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
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?
 
Zurück