Announcement

Collapse
No announcement yet.

Übertragsrechung über Mehrere Tabellen

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

  • Übertragsrechung über Mehrere Tabellen

    Hallo Leute,

    gibt es eien Möglichkeit über mehrere Tabellen inline Übertragsrechungen zu machen.

    Bsp: Tabelle1
    Datum Wert
    1.1.2015 20
    3.1.2015 5

    Bsp: Tabelle2
    Datum Wert
    28.1.2015 3
    2.2.2015 7
    3.2.2015 11
    4.2.2015 2

    Jetzt möchete ich die ältesten Einträge aus Tabelle2 von den ältesten Einträgen aus Tabelle1 abziehen

    Also ResultatTabelle
    [Datum T1] T1 T2 [T1-T2] [Übertrag]
    1.1.2015 20 3 17 17
    1.1.2015 17 7 10 10
    1.1.2015 10 11 -1 -1
    3.1.2015 4(wegen Übertrag) 2 2 2

    Der Übertrag kommt aus dem Datensatz vom 1.1.2015 aus Tabelle1 von dem ich solange Datensätze von Tabelle2 abziehe bis dieser <= 0 ist. Danach ist der nächste Datensatz von Tabelle1 usw.

    Hat jemand ne Ahnung wie sowas inline geht?
    Zuletzt editiert von alexdgg; 13.05.2015, 15:28.
    AlexDgG

    Es gibt keine dummen Fragen. Nur dumme Antworten!

  • #2
    Gegenfragen:
    Was ist "inline"?
    Wie zieht man Tabelleneinträge von einander ab?
    Was sind die ältesten Datensätze?

    Ich kenne Inline Assembler, aber das scheint hier nicht zu passen.
    Gruß, defo

    Comment


    • #3
      Na mit Inline meine ich in einem Statement und nicht in einem Cursor (Das ist kein Problem). Die ältetsten meine ich vom Datum her. Und abgezogen werden die Werte aus den Tabellen. Zum Verständnis. Ich habe eine Tabelle Überstunden und eine Tabelle Absetzer. Ich muss jetzt alle Absetzer den Überstunden vom Datum her zuordnen, da diese ans Lohnbüro gemeldet werden müssen. Also will ich die gemeldeten Absetzer von den Überstunden abziehen.
      AlexDgG

      Es gibt keine dummen Fragen. Nur dumme Antworten!

      Comment


      • #4
        Originally posted by alexdgg View Post
        Na mit Inline meine ich in einem Statement und nicht in einem Cursor (Das ist kein Problem). Die ältetsten meine ich vom Datum her. Und abgezogen werden die Werte aus den Tabellen. Zum Verständnis. Ich habe eine Tabelle Überstunden und eine Tabelle Absetzer. Ich muss jetzt alle Absetzer den Überstunden vom Datum her zuordnen, da diese ans Lohnbüro gemeldet werden müssen. Also will ich die gemeldeten Absetzer von den Überstunden abziehen.
        Also reines SQL statt Programmcode.
        Vom Datum her hatte ich mir schon gedacht, weil es offenbar kein anderes Kriterium für das "Alter" gibt. Bleibt die Frage, was alles unter "älteste" fällt. Wäre es nur das "älteste" wäre es fast klar, aber auch das ist nicht eindeutig.
        Dann wäre die Frage, wie die Datumswerte in Relation stehen, also was wovon abgezogen wird, sprich wie ist die Sortierung der beiden Tabellen vor der Rechenoperation.
        Gruß, defo

        Comment


        • #5
          Ich verstehe auch den Zusammenhang zwischen den Tabellen nicht richtig. Dazu verstehe ich ausserdem auch nicht was den "aeltesten" definiert. Gruppiert nach Tag? Jahr? Oder einfach danach sortieren und die verschiedenen Zeilen miteinander verrechnen?

          Generell wuerde ich sagen dass in purem SQL nichts funktioniert was in etwa so lauten koennte: "nimm den Wert der aktuellen Zeile und mache damit eine Rechenoperation mit einem Wert aus der letzten Zeile". SQL kennt grundsaetzlich keine Reihenfolge. Die einzige "Reihenfolge" die es scheinbar gibt ist die Sortierung. Aber in der Sprache selbst hat man es immer mit unsortierten Mengen zu tun die man selbst in eine gewisse Relation bringen muss. Sobald Du etwas "nacheinander" machen moechtest ist SQL nicht mehr geeignet. SQL ist keine prozedurale Sprache.

          Comment


          • #6
            Also die sach ist Eindeutig. Ziehe solange die ältesten (Datum) Absetzer von den älteten Überstunden ältesten (Datum) ab und merke dir das Datum, bis die Resource auf 0 ist danach den nächts jüngeren Datensatz usw...
            Ein Join ist nicht möglich, das es zwischen den Tabellen keinen eindeutigen Schlüßel bezüglich des Datum gibt.
            Ich dachte das mit den neuen Analytic Funktionen eine Möglichkeit besteht so was zu machen. Ich habe keine Lust jedesmal zwei Cursor zu verschachteln und dadrin mindestens eine While Scheilfe laufen zu lassen.
            AlexDgG

            Es gibt keine dummen Fragen. Nur dumme Antworten!

            Comment


            • #7
              Originally posted by alexdgg View Post
              ...bis die Resource auf 0 ist danach den nächts jüngeren Datensatz usw...
              Das ist wohl der schwierig Part. Dazu muesste man eine Beziehung zwischen den Zeilen herstellen. Ich habe jetzt allerdings auch nur an standard SQL gedacht. Ob es irgendwelche speziellen MSSQL Erweiterung gibt weiss ich nicht.

              Comment


              • #8
                Originally posted by alexdgg View Post
                Also die sach ist Eindeutig.
                Ich dachte das mit den neuen Analytic Funktionen eine Möglichkeit besteht so was zu machen. Ich habe keine Lust jedesmal zwei Cursor zu verschachteln und dadrin mindestens eine While Scheilfe laufen zu lassen.
                Dafür dass es eindeutig ist, muss man Dir das aber ganz schön aus der Nase ziehen. "Absetzer" bspw. sagen mir (immer) noch nichts und die "Ressourcen" sind wahrscheinlich die "Werte" Attribute aus Deinen Tabellen. Wie auch immer..
                Wenn "neue" Analytic Funktionen sich auf aktuelle MSSQL Server bezieht, also 2012 oder neuer, falls es das gibt, bin ich da ganz zuversichtlich, dass man mit SQL auskommt.
                Gruß, defo

                Comment


                • #9
                  Dann versuche ich es einfacher zu beschreiben. Ich habe eine Kiste; in die lege ich fortlaufend Äpfel rein (am 1.1.2015 10 Stück, am 3.1.2015 15 Stück …). Jetzt nimmt jemand fortlaufend aus diese Kiste Äpfel raus und zwar immer diejenigen, die zuerst reingekommen sind (am 5.2.2015 5 Stück vom 1.1.2015, am 7.2.2015 3 Stück vom 1.1.2015 und am 8.2.2015 10 Stück [diesmal 2 Stück vom 1.1.2015 und 8 Stück vom 3.1.2015, weil vom 1.1.2015 nur noch 2 Stück da sind!])
                  Typisches FIFO Probelm! Da hätte ich gerne eine inline Abfrage auf sowas
                  Einfacher kann ich mein Problem nicht erklären!
                  Zuletzt editiert von alexdgg; 13.05.2015, 18:11.
                  AlexDgG

                  Es gibt keine dummen Fragen. Nur dumme Antworten!

                  Comment


                  • #10
                    Originally posted by alexdgg View Post
                    Typisches FIFO Probelm! Da hätte ich gerne eine inline Abfrage auf sowas
                    Einfacher kann ich mein Problem nicht erklären!
                    Ja, also FIFO ist ok, das bekommt man mit sortieren noch hin. Aber der Kern des Problems ist, dass SQL mengenorientiert und Mengen über Joinkriterien verknüpft werden müssten, wenn man gezielt arbeiten will (außer man will gezielt alles mit allem, was hier auch nicht passt).
                    Wie schon angemerkt wurde, ist allein der Zugriff auf einen "Vorgänger" oder "Nachfolger" Wert kein(!) klassisches SQL Metier. Das bekommt man aber mit Analytic Functions (lag / lead) hin. Bleibt der Zugriff auf die 2. alte Apfelkiste mit Mengenübertrag.
                    Das bekommst Du mangels Join Kriterien nicht (so einfach) hin.
                    Am ehesten könnte ich mir hier eine Funktion vorstellen, die das macht. Diese Funktion müsste allerdings "stateful" sein und sich sozusagen den letzten Zugriff bzw. dessen Parameter merken. Bei Oracle weiß ich, dass das geht, bei MS SQL weiß ich es nicht.
                    Dann bist Du zwar schon sehr nahe an Coding mit Cursor, aber es wäre immernoch im SQL Statement einsetzbar, also bspw. Reporting usw.
                    Gruß, defo

                    Comment

                    Working...
                    X