Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Select Abfrage

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von JudAD, 2 Juni 2017.

  1. JudAD

    JudAD Fleissiger Benutzer

    Hallo Zusammen,

    ich verzweifle wieder an der Umsetzung einer Abfrage. Ich möchte aus einer Tabelle nur die Werte anzeigen bei denen in APLATZ der Wert 50-01 enthalten ist und in POSID der höchste Wert je BELEG ist! Das wäre die Beispieltabelle

    BELEG APLATZ POSID
    87381 | 50-01 | 40
    87381 | 36-01 | 50
    87481 | 36-01 | 20
    87740 | 60-07 | 10
    87740 | 35-05 | 20
    87740 | 50-01 | 30
    87740 | 36-01 | 40
    87740 | 60-03 | 50
    88353 | 60-02 | 10
    88353 | 22-02 | 20
    88353 | 50-01 | 30

    Und als Ergebnis hätte ich gerne das nur folgender Datensatz ausgegeben wird

    88353 | 50-01 | 30

    denn nur bei diesem Beleg hat der Datensatz zum APLATZ 50-01 den höchsten POSID Wert je Beleg. Bei alle anderen Datensätzen mit dem APLATZ 50-01 ist der POSID Wert nicht der höchste je Beleg.

    Vielen Dank im Voraus
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from judad ;
     beleg | aplatz | posid
    -------+--------+-------
     87381 | 50-01  |  40
     87381 | 36-01  |  50
     87481 | 36-01  |  20
     87740 | 60-07  |  10
     87740 | 35-05  |  20
     87740 | 50-01  |  30
     87740 | 36-01  |  40
     87740 | 60-03  |  50
     88353 | 60-02  |  10
     88353 | 22-02  |  20
     88353 | 50-01  |  30
    (11 Zeilen)
    
    test=*# select * from judad where aplatz = '50-01' and (beleg, posid) in (select beleg, max(posid) from judad group by beleg);
     beleg | aplatz | posid
    -------+--------+-------
     88353 | 50-01  |  30
    (1 Zeile)
    
    test=*#
    
    sollte auch M$SQL können, denke ich mal ...
     
  3. JudAD

    JudAD Fleissiger Benutzer

    Hi & danke für die schnelle Antwort.

    Ich habe nun die reelen Werte genommen:

    select * from judapl03_2 where aplatz_id = '50-01' and (belnr_id, pos_id) in (select belnr_id, max(pos_id) from judapl03_2 group by belnr_id)

    Leider bekomme ich beim SQL-Server 2008R2 folgende Meldung:
    Meldung 4145, Ebene 15, Status 1, Zeile 1
    An expression of non-boolean type specified in a context where a condition is expected, near ','.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    *Shrug*

    Vielleicht kann M$SQL keinen Row-Vergleich a la (a,b) = (x,y), dann halt auf 2 Vergleiche aufdröseln.


    .oO( immer diese fehlenden Features woanders ... )
     
  5. JudAD

    JudAD Fleissiger Benutzer

    Hmmm - sorry verstehe ich nicht. Wie meinst Du das mit 2 Vergleiche aufdröseln?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    vielleicht so:

    Code:
    test=*# select * from judad j inner join (select beleg, max(posid) from judad group by beleg) foo on j.beleg=foo.beleg and j.posid=foo.max where aplatz = '50-01' ;
     beleg | aplatz | posid | beleg | max
    -------+--------+-------+-------+-----
     88353 | 50-01  |  30 | 88353 |  30
    (1 Zeile)
    
     
  7. JudAD

    JudAD Fleissiger Benutzer

    Meldung 8155, Ebene 16, Status 2, Zeile 2
    No column name was specified for column 2 of 'foo'.
    Meldung 207, Ebene 16, Status 1, Zeile 2
    Invalid column name 'max'.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    versuch mal, via Alias dem Resultat von max() einen Namen zu geben, und verwenden diesen dann.
     
  9. JudAD

    JudAD Fleissiger Benutzer

    select * from judapl03_2 j inner join (select belnr_id, max(pos_id) from judapl03_2 group by belnr_id) foo on j.belnr_id=foo.belnr_id and j.pos_id=foo.max where aplatz_id = '50-01'

    das war die Anweisung
     
  10. JudAD

    JudAD Fleissiger Benutzer

    Ich bin leider was SQL angeht nicht so der crack. Insbesonder das Thema Aias check ich nicht.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    man beachte die GROßBUCHSTABEN

    Code:
    test=*# select * from judad j inner join (select beleg, max(posid) AS VOLL_COOLER_ALIAS from judad group by beleg) foo on j.beleg=foo.beleg and j.posid=foo.VOLL_COOLER_ALIAS where aplatz = '50-01' ;
     beleg | aplatz | posid | beleg | voll_cooler_alias
    -------+--------+-------+-------+-------------------
     88353 | 50-01  |  30 | 88353 |  30
    (1 Zeile)
    
    test=*#
    
     
  12. JudAD

    JudAD Fleissiger Benutzer

    Danke das sieht nun super aus !
     
    akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden