Ergebnis 1 bis 6 von 6

Thema: Join einschrnken; Soviele joins bis ein bestimmtes kriterium erfüllt ist Summe>=Ziel

  1. #1
    Crypi ist offline Erfahrener Benutzer
    Registriert seit
    28.12.2005
    Ort
    Hamburg
    Beiträge
    127

    Standard Join einschrnken; Soviele joins bis ein bestimmtes kriterium erfüllt ist Summe>=Ziel

    Guten Morgen liebes Forum,

    frohes neues Jahr! :-)

    Ich hadere momentan mit einem Problem.
    Es ist ein Lager (Inventur) bei dem festgestellt werden soll, wieviel die bestehenden Lagerbestände wert sind.


    Ich habe eine Tabelle in der zu einzelnen Positionen Summen gebildet werden.

    Lager
    | laufendenummer | laufendenummer_einzelteil | bestand |

    Lieferung
    | laufendenummer| laufendenummer_einzelteil | menge | preis | datum |

    Mit jeder Lieferung die eingebucht wird, erhöht sich der Bestand im Lager.
    Über die Zeit wird jetzt aber auch etwas aus dem Lager gebucht.
    Dass heißt der Bestand reduziert sich.

    Ich möchte jetzt Feststellen wieviel das was ich im Lager habe wert ist.

    Dafür muss ich soviele Lieferungen erfassen, wie nötig sind um mit deren Liefermenge den aktuellen Bestand zu erreichen.
    Mit den in den Lieferungen angegebenen Preisen kann ich dann den Wert bestimmen.

    Ich möchte dies jetzt aber für alle Bestände in einer Abfrage erledigen.

    Mein einziges brauchbares Ergebnis, dass ich bisher vorweisen kann ist:

    Select * from Lager as a
    left join Lieferung as b
    on a.laufendenummer_einzelteil = b.laufendenummer_einzelteil

    hiermit bekäme ich dann aber alle jemals gelieferten Lieferungen... was eindeutig zu viel ist.

    Die nächste Möglichkeit wäre
    Select * from Lager as a
    left join Lieferung as b
    on a.laufendenummer_einzelteil = b.laufendenummer_einzelteil
    left join Lieferung as c
    on a.laufendenummer_einzelteil = c.laufendenummer_einzelteil and b.laufendenummer<>c.laufendenummer
    ...

    dabei könnte ich dann soviele joins hinzufügen wie ich Lieferungen erfassen will. Dabei kann es dann aber vorkommen, dass ich nicht genug Lieferungen erfasse weil ich es auf z.B. fünf beschränkt habe.

    Ich suche jetzt eine Lösung bei der ich genau so viele Lieferungen erfasse um den Bestand zu erreichen.

    Gibt es eine Möglichkeit das zu realisieren?

    Ich danke euch für eure Mühe!
    Crypi

  2. #2
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Crypi Beitrag anzeigen
    Guten Morgen liebes Forum,

    frohes neues Jahr! :-)

    Ich hadere momentan mit einem Problem.
    Es ist ein Lager (Inventur) bei dem festgestellt werden soll, wieviel die bestehenden Lagerbestände wert sind.


    Ich habe eine Tabelle in der zu einzelnen Positionen Summen gebildet werden.

    Lager
    | laufendenummer | laufendenummer_einzelteil | bestand |

    Lieferung
    | laufendenummer| laufendenummer_einzelteil | menge | preis | datum |

    Mit jeder Lieferung die eingebucht wird, erhöht sich der Bestand im Lager.
    Über die Zeit wird jetzt aber auch etwas aus dem Lager gebucht.
    Dass heißt der Bestand reduziert sich.

    Ich möchte jetzt Feststellen wieviel das was ich im Lager habe wert ist.

    Dafür muss ich soviele Lieferungen erfassen, wie nötig sind um mit deren Liefermenge den aktuellen Bestand zu erreichen.
    Mit den in den Lieferungen angegebenen Preisen kann ich dann den Wert bestimmen.

    Ich möchte dies jetzt aber für alle Bestände in einer Abfrage erledigen.

    Mein einziges brauchbares Ergebnis, dass ich bisher vorweisen kann ist:

    Select * from Lager as a
    left join Lieferung as b
    on a.laufendenummer_einzelteil = b.laufendenummer_einzelteil

    hiermit bekäme ich dann aber alle jemals gelieferten Lieferungen... was eindeutig zu viel ist.

    Die nächste Möglichkeit wäre
    Select * from Lager as a
    left join Lieferung as b
    on a.laufendenummer_einzelteil = b.laufendenummer_einzelteil
    left join Lieferung as c
    on a.laufendenummer_einzelteil = c.laufendenummer_einzelteil and b.laufendenummer<>c.laufendenummer
    ...

    dabei könnte ich dann soviele joins hinzufügen wie ich Lieferungen erfassen will. Dabei kann es dann aber vorkommen, dass ich nicht genug Lieferungen erfasse weil ich es auf z.B. fünf beschränkt habe.

    Ich suche jetzt eine Lösung bei der ich genau so viele Lieferungen erfasse um den Bestand zu erreichen.

    Gibt es eine Möglichkeit das zu realisieren?

    Ich danke euch für eure Mühe!
    Crypi

    Irgendwie so:

    Code:
    test=*# select * from lager;
     id | teil_id | bestand
    ----+---------+---------
      1 |       1 |      10
      2 |       2 |     200
      3 |       3 |      30
    (3 rows)
    
    test=*# select * from lieferung;
     id | teil_id | menge | preis |   datum
    ----+---------+-------+-------+------------
      1 |       1 |     5 |  2.10 | 2012-01-01
      2 |       1 |    10 |  2.05 | 2012-01-02
      3 |       2 |   300 |  3.00 | 2012-01-03
      4 |       3 |    20 | 10.00 | 2012-01-04
      5 |       1 |    10 |  1.99 | 2012-01-04
      6 |       1 |    20 |  1.90 | 2012-01-05
      7 |       1 |     2 |  0.50 | 2012-01-06
    (7 rows)
    
    test=*# select * from (select * from lager left join (select *, sum(menge) over (partition by teil_id order by datum desc) from lieferung order by teil_id) foo on lager.teil_id = foo.teil_id order by lager.teil_id) bla where (sum - menge) < bestand;
     id | teil_id | bestand | id | teil_id | menge | preis |   datum    | sum
    ----+---------+---------+----+---------+-------+-------+------------+-----
      1 |       1 |      10 |  7 |       1 |     2 |  0.50 | 2012-01-06 |   2
      1 |       1 |      10 |  6 |       1 |    20 |  1.90 | 2012-01-05 |  22
      2 |       2 |     200 |  3 |       2 |   300 |  3.00 | 2012-01-03 | 300
      3 |       3 |      30 |  4 |       3 |    20 | 10.00 | 2012-01-04 |  20
    (4 rows)
    Oder?


    Falls ich mich nicht verhauhen habe, sollte es passen. Prüfe es aber noch mal durch. Für einen produktiven Code die * noch eliminieren! Voraussetzung ist PG größer gleich 8.4.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    Crypi ist offline Erfahrener Benutzer
    Registriert seit
    28.12.2005
    Ort
    Hamburg
    Beiträge
    127

    Standard

    Oha, das muss ich erstmal verstehen.
    Und meine Datenbank updaten :-)
    Davor scheue ich mich ja ehrlich gesagt ein bisschen.

    Also muss ich mich damit zu erst auseinandersetzen.

    Außer Du hast noch eine Idee wie es mit 8.1. funktionieren könnte.

    Danke für deine Hilfe!
    Du bist wirklich immer schnell mit deinen Antworten und sie sind immer (also, zumindest was meine Fragen betrifft) von außerordentlicher Qualität!!

    Crypi

  4. #4
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Crypi Beitrag anzeigen
    Außer Du hast noch eine Idee wie es mit 8.1. funktionieren könnte.
    Crypi

    Ja. Ganz schnell updaten, 8.1 ist out-of-livetime.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    Crypi ist offline Erfahrener Benutzer
    Registriert seit
    28.12.2005
    Ort
    Hamburg
    Beiträge
    127

    Standard

    Ok :-)

    Crypi

  6. #6
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Irgendwie so:

    Code:
    test=*# select * from lager;
     id | teil_id | bestand
    ----+---------+---------
      1 |       1 |      10
      2 |       2 |     200
      3 |       3 |      30
    (3 rows)
    
    test=*# select * from lieferung;
     id | teil_id | menge | preis |   datum
    ----+---------+-------+-------+------------
      1 |       1 |     5 |  2.10 | 2012-01-01
      2 |       1 |    10 |  2.05 | 2012-01-02
      3 |       2 |   300 |  3.00 | 2012-01-03
      4 |       3 |    20 | 10.00 | 2012-01-04
      5 |       1 |    10 |  1.99 | 2012-01-04
      6 |       1 |    20 |  1.90 | 2012-01-05
      7 |       1 |     2 |  0.50 | 2012-01-06
    (7 rows)
    
    test=*# select * from (select * from lager left join (select *, sum(menge) over (partition by teil_id order by datum desc) from lieferung order by teil_id) foo on lager.teil_id = foo.teil_id order by lager.teil_id) bla where (sum - menge) < bestand;
     id | teil_id | bestand | id | teil_id | menge | preis |   datum    | sum
    ----+---------+---------+----+---------+-------+-------+------------+-----
      1 |       1 |      10 |  7 |       1 |     2 |  0.50 | 2012-01-06 |   2
      1 |       1 |      10 |  6 |       1 |    20 |  1.90 | 2012-01-05 |  22
      2 |       2 |     200 |  3 |       2 |   300 |  3.00 | 2012-01-03 | 300
      3 |       3 |      30 |  4 |       3 |    20 | 10.00 | 2012-01-04 |  20
    (4 rows)
    Oder?


    Falls ich mich nicht verhauhen habe, sollte es passen. Prüfe es aber noch mal durch. Für einen produktiven Code die * noch eliminieren! Voraussetzung ist PG größer gleich 8.4.


    Andreas
    Gekürzt:

    Code:
    test=*# select * from lager left join (select *, sum(menge) over (partition by teil_id order by datum desc) from lieferung order by teil_id) foo on lager.teil_id = foo.teil_id  where (sum - menge) < bestand;             
     id | teil_id | bestand | id | teil_id | menge | preis |   datum    | sum
    ----+---------+---------+----+---------+-------+-------+------------+-----
      1 |       1 |      10 |  7 |       1 |     2 |  0.50 | 2012-01-06 |   2
      1 |       1 |      10 |  6 |       1 |    20 |  1.90 | 2012-01-05 |  22
      2 |       2 |     200 |  3 |       2 |   300 |  3.00 | 2012-01-03 | 300
      3 |       3 |      30 |  4 |       3 |    20 | 10.00 | 2012-01-04 |  20
    (4 rows)
    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Ähnliche Themen

  1. Keine Results mit JOIN, ohne JOIN schon
    Von SPYFAN im Forum Andere Datenbanken
    Antworten: 3
    Letzter Beitrag: 25.03.2012, 20:48
  2. Summe von Splaten
    Von minor_73 im Forum SQL
    Antworten: 5
    Letzter Beitrag: 23.06.2010, 14:24
  3. summe über summe
    Von patwilly im Forum SQL
    Antworten: 13
    Letzter Beitrag: 20.11.2008, 15:19
  4. Antworten: 1
    Letzter Beitrag: 08.02.2008, 18:37
  5. Trigger als Sequence mit eigenem "Kriterium"?
    Von pantarhei im Forum Trigger und Funktionen
    Antworten: 4
    Letzter Beitrag: 18.07.2007, 22:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum