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

SQL Abfrage: min über zwei Tabellen (Artikelinformationen und Staffelpreise)

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von sebdatenfrager, 13 März 2020.

  1. sebdatenfrager

    sebdatenfrager Neuer Benutzer

    Hallo zusammen,

    ich habe eine Frage zu einer formlierenden SQL Abfrage.

    In einer Tabelle habe ich Informationen zum Artikel:

    Artikelnr | LiefNr | Mindestmenge in kg | Notiz
    ------------------------------------------------
    A1 | 22 | 15 | von Produktion bevorzugt
    A1 | 30 | 20 | Alternativlieferant
    B0 | 30 | 30 | Materialalternative


    In einer weiteren Tabelle habe ich die zugehörigen Staffelpreise des Artikels und Lieferanten:


    Artikelnr | LiefNr | Staffel | Menge in kg |Preis in €
    ------------------------------------------------
    A1 | 22 | 1 | 10 | 5,00
    A1 | 22 | 2 | 20 | 4,50
    A1 | 22 | 3 | 40 | 4,00

    A1 | 30 | 1 | 35 | 4,40
    A1 | 30 | 2 | 50 | 3,80

    B0 | 30 | 1 | 15 | 6,00
    B0 | 30 | 2 | 30 | 5,50
    B0 | 30 | 3 | 50 | 5,00



    Ich möchte eine Abfrage machen welche beide Tabellen verknüpft und den geringsten Preis der Staffel anzeigt:

    Artikelnr | LiefNr | Mindestmenge | Notiz | Staffel | Menge | Preis
    --------------------------------------------------------------------
    A1 | 22 | 15 | von...| 3 | 40 | 4,00
    A1 | 30 | 20 | Altern| 2 | 50 | 3,80
    B0 | 30 | 30 | Materi| 3 | 50 | 5,00

    Als Ergänzung zur vorherigen Frage: Wie lautet der SQL Befehl mit Einschränkung der LiefNr (z.B. nur 22)

    Vielen Dank für eure Unterstützung






     
  2. akretschmer

    akretschmer Datenbank-Guru

    Du suchst also zuerst in Deiner Preistabelle je Artikel den geringsten Preis. Diese Ergebnissmenge joinst Du dann zu der ersten Tabelle.

    Was hast denn bisher versucht?
     
  3. sebdatenfrager

    sebdatenfrager Neuer Benutzer

    Meine bisherige Abfrage, die nicht zum Ziel führte:

    ich nenne die Tabelle, welche Daten zum Artikel enthält "Artikel" und die andere mit Informationen zum Preis "Artikel_Preis"

    SELECT Artikel.Artikelnr, Artikel.LiefNr, Artikel.Mindestmenge in kg, Artikel.Notiz, Artikel_Preis.Staffel, Artikel_Preis.Menge, Artikel_Preis.Preis
    FROM Artikel
    INNER JOIN Artikel_Preis ON Artikel.Artikelnr = Artikel_Preis.Artikelnr
    WHERE Artikel_Preis.Preis
    (
    SELECT Min(Preis) FROM Artikel_Preis)
    )


    führte nicht zum gewünschten Ergebnis, ich erkenne den Fehler aber nicht.


    Die Abfrage mit min unter SELECT bedingt eine Gruppierung welche alle Preise und Staffeln anzeigt

    SELECT Artikel.Artikelnr, Artikel.LiefNr, Artikel.Mindestmenge in kg, Artikel.Notiz, Artikel_Preis.Staffel, Artikel_Preis.Menge, min(Artikel_Preis.Preis)
    FROM Artikel
    INNER JOIN Artikel_Preis ON Artikel.Artikelnr = Artikel_Preis.Artikelnr
    GROUP BY Artikel.Artikelnr, Artikel.LiefNr, Artikel.Mindestmenge in kg, Artikel.Notiz, Artikel_Preis.Staffel, Artikel_Preis.Menge
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from artikel;
     nr | lief | mindest |   notiz   
    ----+------+---------+------------
     a1 |   22 |      15 | von prod
     a1 |   30 |      20 | alternativ
     b0 |   30 |      30 | material
    (3 rows)
    
    test=*# select * from artikel_preis ;
     nr | lief | staffel | menge | preis
    ----+------+---------+-------+-------
     a1 |   22 |       1 |    10 |    50
     a1 |   22 |       2 |    20 |    45
     a1 |   22 |       3 |    40 |    40
     a1 |   30 |       1 |    35 |    44
     a1 |   30 |       2 |    50 |    38
     b0 |   30 |       1 |    15 |    60
     b0 |   30 |       2 |    30 |    55
     b0 |   30 |       3 |    50 |    50
    (8 rows)
    
    test=*# select a.nr, a.lief, a.mindest, a.notiz, ap.staffel, ap.menge, ap.preis from artikel a inner join ( select distinct on (nr, lief) nr, lief, staffel, menge, preis from artikel_preis order by nr, lief, preis asc) ap on (a.nr, a.lief)=(ap.nr, ap.lief);
     nr | lief | mindest |   notiz    | staffel | menge | preis
    ----+------+---------+------------+---------+-------+-------
     a1 |   22 |      15 | von prod   |       3 |    40 |    40
     a1 |   30 |      20 | alternativ |       2 |    50 |    38
     b0 |   30 |      30 | material   |       3 |    50 |    50
    (3 rows)
    
    test=*# 
    
    Achtung, ist mit PostgreSQL gemacht, das DISTINCT ON kann M$SQL evtl. nicht. In dem Fall z.B. mit Window-Funktion arbeiten.
     
    Walter 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