Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
26
ZUGRIFFE
4880
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Frostie10 ist offline Rookie
    Registriert seit
    Jun 2008
    Beiträge
    7
    Hallo

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

    MIt
    Code :
    1
    
    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:
    Code :
    1
    
    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
     

  2. #2
    kuddeldaddeldu ist offline Mitglied Diamant
    Registriert seit
    Dec 2007
    Ort
    Bremen
    Beiträge
    3.418
    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
     

  3. #3
    Cojote ist offline Mitglied Gold
    Registriert seit
    Oct 2006
    Beiträge
    110
    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)
     

  4. #4
    Avatar von Breit
    Breit ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Ort
    Thüringen
    Beiträge
    63
    Du hängst einfach
    Code :
    1
    
    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.
     
    Ist der neu? - Nein, ist Linux drauf!

  5. #5
    kuddeldaddeldu ist offline Mitglied Diamant
    Registriert seit
    Dec 2007
    Ort
    Bremen
    Beiträge
    3.418
    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
     

  6. #6
    Cojote ist offline Mitglied Gold
    Registriert seit
    Oct 2006
    Beiträge
    110
    @kuddeldaddeldu: Stimmt du hast recht. War gestern nicht ganz bei der Sache.
     

  7. #7
    Saban ist offline Mitglied Gold
    Registriert seit
    Nov 2007
    Beiträge
    220
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    
     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
     

  8. #8
    Avatar von shutdown
    shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.025
    Könnte vielleicht irgendjemand von euch mal das verwendete DBMS mitteilen?
    Nur so könnte man nämlich zielgerichtet helfen.

    Ein
    Code :
    1
    
    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.
     
    Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!

  9. #9
    Saban ist offline Mitglied Gold
    Registriert seit
    Nov 2007
    Beiträge
    220
    Hi!

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

    MfG
    Saban
     

  10. #10
    Avatar von shutdown
    shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.025
    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.
     
    Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!

  11. #11
    Saban ist offline Mitglied Gold
    Registriert seit
    Nov 2007
    Beiträge
    220
    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
     

  12. #12
    Avatar von shutdown
    shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.025
    Dann gibt es nur die Möglichkeit, die Abfrage in 2 Teile zu teilen

    Original mit mehreren Werten
    Code sql:
    1
    
    SELECT WAS_ICH_WISSEN_WILL FROM TABELLEN WHERE WAS_ERFÜLLT_SEIN_MUSS

    Es wird nun ein Bindeglied BINDER eingeführt

    Code sql:
    1
    2
    
    SELECT WAS_ICH_WISSEN_WILL FROM TABELLEN WHERE BINDER = (...)
    AND WAS_ERFÜLLT_SEIN_MUSS

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

    Code sql:
    1
    
    SELECT MIN(BINDER_SPALTE) FROM TABELLEN WHERE WAS_ERFÜLLT_SEIN_MUSS


    Damit kommst du dann zu folgendem Endergebnis:

    Code sql:
    1
    2
    3
    
    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
     
    Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!

  13. #13
    Saban ist offline Mitglied Gold
    Registriert seit
    Nov 2007
    Beiträge
    220
    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:
    Code java:
    1
    2
    3
    
    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
     

  14. #14
    Avatar von shutdown
    shutdown ist offline Mitglied Smaragd
    Registriert seit
    Jun 2004
    Beiträge
    1.025
    1. zu wenig Code
    2. wahrscheinlich der falsche Code
     
    Versuche nie Probleme zu lösen, von deren Existenz du noch gar nichts weißt!

  15. #15
    Saban ist offline Mitglied Gold
    Registriert seit
    Nov 2007
    Beiträge
    220
    Hi!

    Also hier mein Code für die DB-Connection:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    
    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:
    Code java:
    1
    
    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
     

Thema nicht erledigt
Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Int-Wert in ein SQL Abfrage
    Von nsrplanet im Forum Visual Basic 6.0
    Antworten: 4
    Letzter Beitrag: 03.03.08, 15:07
  2. Abfrage nach Wert in DB
    Von Papenburger im Forum PHP
    Antworten: 6
    Letzter Beitrag: 11.04.07, 14:38
  3. Antworten: 8
    Letzter Beitrag: 28.10.05, 22:08
  4. Abfrage von Wert + Ausgeben
    Von tom_d20 im Forum PHP
    Antworten: 1
    Letzter Beitrag: 09.10.05, 08:05
  5. abfrage für wert = text
    Von tinella im Forum Java
    Antworten: 4
    Letzter Beitrag: 11.11.04, 10:03