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

MySql Abfrage - Zeile bei der 95% der Summe erreicht sind

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von LF1986, 23 Oktober 2020.

  1. LF1986

    LF1986 Neuer Benutzer

    Moin,

    vielleicht habt ihr eine Lösung für mich.
    Ich habe eine Verkaufshistorie mit folgenden Spalten.

    - Verkaufspreis
    - Einkaufspreis
    - Menge
    Damit kann ich die Zeilensumme und den Kalkulationszuschlag errechnen.

    Ich möchte nun den Kalkulationszuschlag ermitteln, ab dem ich keinen Umsatz mehr generiere, um diese Kalkulation als Maximale Kalkulation zu hinterlegen. Da es Aber einige Ausreißer gibt, kann ich nicht das Maximum nehmen.

    Meine Idee: Ich sortiere alle Verkaufszeilen mit Betrag aufsteigend nach Kalkulationsaufschlag. Die Zeile bei der z.B. 95% des kumulierten Gesamtumsatzes überschritten wird möchte ich ausgeben.

    Betrag | Zuschlag | Kumulierter Betrag
    900 | 20 | 900
    100 | 23 | 1000
    200 | 28 | 1200
    800 | 42 | 2000
    100| 46 | 2100
    50 | 58 | 2150 <--- Schwelle bei 58 % überschritten
    20| 62 | 2170
    60 | 71 | 2230

    _____
    Summe = 2230
    Schwelle bei 2230 * 0,95 = 2119

    Vielleicht hat ja jemand eine Idee. Danke schon mal vorab!

    Gruß
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Kling nach Anwendung von Window-Funktionen - die Dein MySQL möglicherweise nicht kann.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    um es mal zu zeigen:

    Code:
    test=*# select * from lf1986;
     id | betrag
    ----+--------
      1 |    900
      2 |    100
      3 |    200
      4 |    800
      5 |    100
      6 |     50
      7 |     20
      8 |     60
    (8 rows)
    
    test=*# with foo as (select id, betrag, sum(betrag) over (order by id) as running_sum, sum(betrag) over (order by id rows between unbounded preceding and unbounded following) as gesamt from lf1986) select * from foo;
     id | betrag | running_sum | gesamt
    ----+--------+-------------+--------
      1 |    900 |         900 |   2230
      2 |    100 |        1000 |   2230
      3 |    200 |        1200 |   2230
      4 |    800 |        2000 |   2230
      5 |    100 |        2100 |   2230
      6 |     50 |        2150 |   2230
      7 |     20 |        2170 |   2230
      8 |     60 |        2230 |   2230
    (8 rows)
    
    test=*# with foo as (select id, betrag, sum(betrag) over (order by id) as running_sum, sum(betrag) over (order by id rows between unbounded preceding and unbounded following) as gesamt from lf1986) select *, case when running_sum / gesamt::numeric > 0.5 then '*' else '' end as "50%", case when running_sum / gesamt::numeric > 0.95 then '*' else '' end as "95%" from foo;
     id | betrag | running_sum | gesamt | 50% | 95%
    ----+--------+-------------+--------+-----+-----
      1 |    900 |         900 |   2230 |     |
      2 |    100 |        1000 |   2230 |     |
      3 |    200 |        1200 |   2230 | *   |
      4 |    800 |        2000 |   2230 | *   |
      5 |    100 |        2100 |   2230 | *   |
      6 |     50 |        2150 |   2230 | *   | *
      7 |     20 |        2170 |   2230 | *   | *
      8 |     60 |        2230 |   2230 | *   | *
    (8 rows)
    
    test=*#
    
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Nachtrag:

    das was Du willst ist prinzipiell nicht möglich, solange Du kein Sortierkriterium wie z.B. einen Timestamp hast, wann der Verkauf erfolgte.
     
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