Announcement

Collapse
No announcement yet.

Letzen 12 Werte nach Datum aus Tabelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Letzen 12 Werte nach Datum aus Tabelle

    Hallo,

    ich habe da mal ein etwas kniffliges Problem. Ev. hat einer von Euch da eine tolle Idee oder Lösung.
    Ich habe eine Tabelle mit Bruttowerten, Buchungsdatum, Kd-Nr und div. Informationen.
    Nun will ich aus der Tabelle pro Kd-Nr. das letzte Buchungsdatum mit Bruttowert auslesen.
    Aber auch die nächsten 11 Werte mit Buchungsdatum. Will heißen die Umsätze der letzen 12 Zahlungen.
    Davon soll der AVG gebildet werden, sind es weniger als 12 Werte dann Entsprechend der Anzahl den AVG ermitteln.

    Hier mal mein nicht grade schöner Ansatz:

    [highlight=sql]
    SELECT a.Kd-Nr,
    a.Bruttowert,
    a.Buchungsdatum,
    add_months(max(a.Buchungsdatum), -1) AS Datum_2,
    a......................
    FROM p_abrechnung a,
    tmp_p_abrechnung b
    WHERE (a...... = 'Q01' a....... ^= '01'
    AND a....... ^= 0.01
    AND a........ ^= 'J')
    AND ((a........ IN ('06',
    '08',
    '16',
    '17')
    AND a.......... = 'S'
    AND a.......... = 'F')
    OR a.......... IN ('SOLLZU',
    'SOLLAB')
    OR a........... = 'Z')
    AND b.Buchungsdatum =
    (SELECT add_months(max(a.Buchungsdatum), -1)
    FROM p_Abrechnung)
    GROUP BY a.Kd-Nr,
    a.Bruttowert;
    [/highlight]

    Das ganz würde ich in eine Temp Schreiben lassen und mit 12 Läufen [ select add_months(max(a.abgerechnet_ab), -1,2,3,4,....) ] befüllen.
    Danach ein select auf die Temp mit AVG Werten ja Kd-Nr.
    Nur kommen bei diesem SQL keine Werte zurück. Liegt bestimmt an dem Buchungsdatum vergleich.
    Gebe ich dem select eine feste Kd-Nr. mit läuft das ganze natürlich top.

    Ich bin mir sicher es geht auch viel geschickter!!!
    Nur fehlt mir grade die Nötige Idee dazu :-(

    Ich bin mal auf Eure Ideen gespannt!!

    Schon mal vielen Dank im Voraus
    Wolfgang
    Attached Files
    Zuletzt editiert von Wolfgang Macke; 20.05.2014, 16:47.

  • #2
    Originally posted by Wolfgang Macke View Post
    Hier mal mein nicht grade schöner Ansatz:
    Kann ich nur bestätigen. Es sieht allein schon häßlich aus.
    Bitte schau Dir mal an, wie man ein SQL hier im Forum ordentlich formatiert. Außerdem gibt es online formatter, die das Statement richtig setzen.

    Deine Leserschar wird sicher schlagartig größer. Damit steigt die Wahrscheinlichkeit auf Hilfe ebenso.
    Gruß, defo

    Comment


    • #3
      Sieht doch viel besser aus oder?
      Ich mein, man kann es jetzt bequem lesen

      Was meinst Du mit die letzten 12? Hab eigentlich gedacht, diese jüngsten 12 Buchungen sind ansosten zeit unabhängig, können also bspw an einem Tag stattfinden. In Deinen Erklärungen hantierst Du aber mit add_month, also eher die letzten 12 Monate?
      Gruß, defo

      Comment


      • #4
        Ja genau, es geht um die letzten 12 Monate.
        Es gibt eigentlich immer nur eine Buchung pro Monat und Kunde.
        Deswegen ja auch add_month im negativen, um zurück zu schauen.

        Comment


        • #5
          Die Antwort wäre ok, wenn da nicht "eigentlich" stünde.
          Entweder die letzten 12 Buchungen oder die letzten 12 Monate. "eigentlich" gibt es nicht in SQL.
          Wenn das System per Constraint gegen mehr als eine Buchung geschützt ist (oder auch anders), dann ist das vielleicht das gleiche.

          P.S.: Noch was, geht es um die letzten 12 Monate/Buchungen, die überhaupt vorliegen oder um 12 Monate/Buchungen rückwärts von einem Stichtag (z.B. aktuelles Datum)
          Zuletzt editiert von defo; 21.05.2014, 06:56.
          Gruß, defo

          Comment


          • #6
            Es geht um die letzten 12 Monate die vorliegen und es gibt eine Buchung pro Monat!

            Comment


            • #7
              Habe mal etwas gemacht, um abgelaufene Dokumente zu finden. Es sollten alle Dokumente selektiert werden, nur die 4 neuesten nicht

              "select * from (select id,ROW_NUMBER() OVER (ORDER BY datum DESC) rnum from dokument)where rnum >4 ")

              Ev. kann das weiterhelfen
              Christian

              Comment


              • #8
                Hallo Christian,
                vielen Dank für den Ansatz, leider kommt das nicht so hin. es gibt x Buchungen pro Kd-Nr. je eine Pro Monat. Gefragt sind aber nur die letzten 12.
                Und da kann pro Kd-Nr jeweils ein ganz anderes Buchungsdatum als erste Stehen. Es können natürlich auch mal weniger als 12 sein.
                Von den ermittelten Buchungen sollen dann ja die AVG's pro Kd-Nr ausgegeben werden.

                Comment


                • #9
                  Es wird ja mit orderby nach datum sortiert. Insofern ist es nicht relevant, was als erstes steht. Die Technik ist, dass die ROW_NUMBER von Oracle genutzt wird. Bei einem einfachen select, wird die "fest" vorgegeben. Deshalb ein subselect, der die Daten sortiert und dann ein select, der dann auf die ROW_NUMBER geht.
                  Christian

                  Comment


                  • #10
                    ok, ich würde zunächst die Grenzwerte je Kunde bestimmen, um dann individuell die letzten 12 Monate abfragen zu können.
                    Also ungefähr "select max(datum), berchnet12MonateVor(max(datum)) from entries".
                    Das dann noch mal joinen mit den gleichen entries und den AVG bilden innerhalb der Datumsgrenzen jedes Kunden.

                    Achso, ich geh davon aus, Du brauchst nur den AVG, nicht alle 12 Werte einzeln..
                    Gruß, defo

                    Comment

                    Working...
                    X