Announcement

Collapse
No announcement yet.

Create View über upgedatete Select-Abfrage

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

  • Create View über upgedatete Select-Abfrage

    Hallo zusammen,

    und einen schönen guten Abend.

    Ich bin neu hier und möchte Euch gleich mit einem Problem belästigen

    Ich habe eine Tabelle welche u.a. eine Spalte Beginn und eine Spalte Ende enthält.
    Sowohl Beginn als auch Ende können an einem beliebigen Monatstag sein.

    Regelmäßig muss ich die Daten nach betroffenen Monaten zusammenfassen.
    Bisher mache ich das etwas kompliziert:
    Beispiel Dezember 2012
    1.
    Code:
    CREATE VIEW IF NOT EXISTS "V2012_12" AS
    SELECT *
    FROM tabelle_test
    WHERE Ende >= "2012-12-01"
      AND Beginn <= "2012-12-31"
    ORDER BY Beginn ASC, Ende DESC
    2.
    Code:
    UPDATE tableName
    SET 
    Beginn="2012-12-01" WHERE Beginn <"2012-12-01"
    3.
    Code:
    UPDATE tableName
    SET 
    Ende ="2012-12-31" WHERE Ende>"2012-12-31"
    Damit habe ich alle den Dezember 2012 betreffenden Datensätze zusammengefasst.

    Gibt es eine Möglichkeit alles drei in einem Create View auszuführen?

    Vielen Dank schon einmal

    Wolf-Tilmann
    Zuletzt editiert von Wolf-Tilmann; 14.10.2012, 21:06.
    Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

    Ach ja:
    Daten lassen sich am Besten mit der Keule bearbeiten.

  • #2
    Originally posted by Wolf-Tilmann View Post

    Regelmäßig muss ich die Daten nach betroffenen Monaten zusammenfassen.
    Bisher mache ich das etwas kompliziert:
    Beispiel Dezember 2012
    1.
    Code:
    CREATE VIEW IF NOT EXISTS "V2012_12" AS
    SELECT *
    FROM tabelle_test
    WHERE Ende >= "2012-12-01"
      AND Beginn <= "2012-12-31"
    ORDER BY Beginn ASC, Ende DESC
    2.
    Code:
    UPDATE tableName
    SET 
    Beginn="2012-12-01" WHERE Beginn <"2012-12-01"
    3.
    Code:
    UPDATE tableName
    SET 
    Ende ="2012-12-31" WHERE Ende>"2012-12-31"
    Damit habe ich alle den Dezember 2012 betreffenden Datensätze zusammengefasst.

    Gibt es eine Möglichkeit alles drei in einem Create View auszuführen?

    Vielen Dank schon einmal

    Wolf-Tilmann
    Deinem Code nach zu urteilen hast Du 2 Tabellen (table_test und tableName) sowie einen VIEW V2012_12. Dieser basiert auf table_test, aktualisieren tust Du tableName. Deine Updates erscheinen mir unlogisch,
    so würde das erste Update aus 2012-06-17 ein 2012-12-01, das zweite Update ab dem nächsten Jahr immer alle Ende-Werte auf 2012-12-31 setzen. Erscheint mir alles etwas halbgar und auch nicht mit Deiner Beschreibung dessen, was Du erreichen willst, vereinbar.

    Hint: falls Du PG ab 9.2 hast, es gibt DATERANGE - Datentyp, kann man nette Dinge mit machen. Vielleicht sogar ganz einfach Dein Problem lösen.

    Andreas

    Comment


    • #3
      Hallo Andreas,

      Danke für Deine Antwort.
      Sorry mir sind da leider kleine Übertagungsfehler unterlaufen.

      Es existieren
      1. die Tabelle "tabellel_test"
      2. dDer View "V2012_12"

      Als Datenbank verwende ich SQLite (das merkt mein Admin nicht .-))

      Als längeres Ergebnis berechne ich (nach einem bestimmten Schlüssel) Gehälter, welche in einem Kalendermonat anfallen.
      Arbeitsverträge können an jedem beliebigen Tag im Monat beginnen und an jedem beliebigen darauffolgenden Tag enden. Das Ganze muss ich nach Kalendermonaten aufschlüsseln.

      Mit der Abfrage zum Erzeugen der Tabelle filtere ich heraus, welcher Arbeitsvertrag im Dezember 2012 liegt.

      Ein Vertrag kann ja vor dem 01. Dezember 2012 beginnen, dann benötige ich für die Summenberechnung "Dezember 2012" die Zeit ab 01.12.2012. Deswegen Beginn="2012-12-01" WHERE Beginn <"2012-12-01". Wenn aber nach dem 01.12.2012 beginnend, ist das bereits als Beginn verwendete Datum passend.

      Ein Vertrag kann über den 31. Dezember 2012 hinausgehen, dann benötige ich für die Summenberechnung "Dezember 2012" die Zeit nach dem 31.12.2012. Deswegen Ende ="2012-12-31" WHERE Ende>"2012-12-31". Wenn vor dem 31.12.2012 endend, ist das bereits als Ende verwendete Datum passend.

      Der View "V2012_12" zeigt mir also genau nur das an, was auf den Dezember 2012 entfällt.

      Jetzt habe ich mich hoffentlich verständlicher ausgedrückt.

      Oder gibt es da eine bessere Lösung?

      Wolf-Tilmann
      Zuletzt editiert von Wolf-Tilmann; 16.10.2012, 06:42.
      Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

      Ach ja:
      Daten lassen sich am Besten mit der Keule bearbeiten.

      Comment


      • #4
        Das klingt alles irgendwie seltsam.
        Du änderst permanent (Monat für Monat) die alten und neuen Start / Enddaten auf den aktuellen Monat, um eine passende Auswertung zu bekommen?
        Oder habe ich das falsch verstanden?
        Gruß, defo

        Comment


        • #5
          Nein, nicht so.

          Einer meiner Jobs ist, dass ich im Voraus die Gehälter für sehr viele geringfügig Beschäftigte bei verschiedenen Geldgebern anfordere. Das kann ich aber stets nur für maximal 2 Kalendermonate.

          Wenn jetzt jemand, z.B. Max Müller, 23 Std/Kalendermonat, 16. Januar 2012 bis 28. Februar 2013, eingestellt wird, rufe ich für die einzelnen Monate (falls mehrere Monate nicht zusammengefasst werden können) das Gehalt ab. Aber nicht nur Max, sondern X, Y, und ... bekommen auch ihr Geld von Z Über den View habe ich die Leute, welche z.B. Dezember 2012 beschäftigt sind, d.H. für welche ich die Gelder für Dezember abrufe. Wenn jemand anteilig beschäftigt ist, bekommt er logischerweise nur für diese Zeit Geld. Der Vertrag von X (20 Std/KalMon) endet am 23.12.2012; dafür beginnt Y (5 Std/KalMon) am 08.12.2012.

          Damit sieht der View VOR dem Anpassen so aus:
          Name Std/KalMon Beginn Ende
          Müller, Max 23 2012-01-16 2013-02-28
          X 20 2012-06-16 2012-12-23
          Y 5 2012-12-08 2013-01-15
          Und nach dem Beginn/Ende anpassen:
          Name Std/KalMon Beginn Ende
          Müller, Max 23 2012-12-01 2012-12-31
          X 20 2012-12-01 2012-12-23
          Y 5 2012-12-08 2012-12-31
          Also nur die den Dezember 2012 betreffenden Daten. Und damit kann ich dann die abzurufenden Gehälter berechnen. (vereinfacht ausgedrückt)
          Das ganze wird dann noch nach Geldgeber gefiltert.

          Und das ganze Vergnügen Monat für Monat.

          Bisschen kompliziert, ist aber so


          Schönen Abend
          Wolf-Tilmann

          EDIT:
          Es muss natürlich eine Tabelle, kein View sein. Sonst ändere ich ja meine Originaltabelle. (Kopf an Wand hau)
          Zuletzt editiert von Wolf-Tilmann; 16.10.2012, 06:45. Reason: Hatte View und Tabelle durcheinandergebracht.
          Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

          Ach ja:
          Daten lassen sich am Besten mit der Keule bearbeiten.

          Comment


          • #6
            Hallo,

            verstehe den Sinn zwar auch nicht, bin aber auch nicht in einer Verleihbude;-)

            Und wenn ich dich recht verstehe, suchst du sowas

            [highlight=sql]
            with data as
            (select 'Müller' name, 23 STUNDEN, TO_DATE('16.01.2012') ANFANG, TO_DATE('16.02.2013') ENDE from DUAL union all
            select 'X', 20, TO_DATE('16.06.2012'), TO_DATE('23.12.2012') from DUAL union all
            select 'Y', 5, TO_DATE('08.12.2012'), TO_DATE('15.01.2012') from DUAL)
            select name,STUNDEN,case when TO_DATE('01.12.2012') between ANFANG and ENDE then TO_DATE('01.12.2012') else ANFANG end as begin,
            case when TO_DATE('31.12.2012') between ANFANG and ENDE then TO_DATE('31.12.2012') else ENDE end as SCHLuss
            from data;
            [/HIGHLIGHT]
            Gruß

            Martin

            Comment


            • #7
              Das hast Du evtl. falsch verstanden. Max Müller, X und Y sind lediglich Beispielnamen bei einem aktuellen Stand von (2012-10-22) 362. Das muss also irgendwie über eine pauschale Abfrage laufen. Wenn ich meine Papenheimer jeden Monat mit Namen eingeben muss kann ich mir gleich die Kugel geben und zwar nicht die goldene.

              Schönen Abend
              Wolf-Tilmann
              Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

              Ach ja:
              Daten lassen sich am Besten mit der Keule bearbeiten.

              Comment


              • #8
                Hallo,
                Originally posted by Wolf-Tilmann View Post
                Das hast Du evtl. falsch verstanden.
                Nein, eher fehlt dir die Kenntniss bestimmter SQL-Konstrukte .
                Das WITH DATA AS (...) dient lediglich der dynamischen Erzeugung der Beispieldaten ohne extra eine Tabelle anlegen zu müssen. Für deinen konkreten Fall lass es also einfach weg und ersetze DATA durch deine Tabelle.

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Könntest Du mir bitte meinen Denkfehler erklären?

                  Ich habe, wie erwähnt 362 Namen, von denen einige im Dezember 2012 arbeiten, manche arbeiten den Dezember durch, andere nur am Anfang; wiederum andere beginnen im Dezember mit der Arbeit.

                  Im obigen Code steht: [HIGHLIGHT=SQL]SELECT 'Müller'[/HIGHLIGHT] und [HIGHLIGHT=SQL]SELECT 'X'[/HIGHLIGHT] und [HIGHLIGHT=SQL]SELECT 'Y'[/HIGHLIGHT]. Ich muss also die Namen eingeben, mit anderen Worten in meiner Liste nachsehen, bei wem Arbeitszeit in den Dezember fällt.
                  Der Bereich leuchtet [HIGHLIGHT=SQL]SELECT name,STUNDEN,CASE WHEN TO_DATE('01.12.2012') BETWEEN ANFANG AND ENDE THEN TO_DATE('01.12.2012') ELSE ANFANG END AS BEGIN,
                  CASE WHEN TO_DATE('31.12.2012') BETWEEN ANFANG AND ENDE THEN TO_DATE('31.12.2012') ELSE ENDE END AS SCHLuss
                  FROM DATA;[/HIGHLIGHT] mir irgendwie ein. (Auch wenn ich mir das nocheinmal genau anshen muss) Hier erfolgt die Änderung auf die Monatsgrenzen.

                  Schönen Abend
                  Wolf-Tilmann
                  Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

                  Ach ja:
                  Daten lassen sich am Besten mit der Keule bearbeiten.

                  Comment


                  • #10
                    Originally posted by Wolf-Tilmann View Post
                    Könntest Du mir bitte meinen Denkfehler erklären?
                    Wo genau hast du denn noch Probleme? Eigentlich müsste die Abfrage von Martin genau die gewünschte Transformation vornehmen (obwohl man das auch mit entsprechenden GREATEST/LEAST-Funktionen realisieren könnte).
                    Und wie schon gesagt, störe dich bitte nicht an dem WITH DATA AS-Konstrukt, dieses dient lediglich für Testzwecke zur Erzeugung einer entsprechenden Datenmenge, ohne eine konkrete Tabelle anlegen zu müssen!

                    Gruß Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment


                    • #11
                      Jetzt habe ich mich einige Zeit damit beschäftigt. Aber ich komme nicht dahinter.
                      Trotzdem: Danke
                      Wolf-Tilmann

                      EDIT

                      damit komme ich näher ran (denke ich - aus vielen Foren und Tips zusammengebastelt), nur ist in der CASE-Anweisung ein Fehler
                      [HIGHLIGHT=SQL]
                      SELECT
                      "Name" ,
                      "Std/KalMon" ,
                      CASE WHEN "Beginn" <= "2012-06-01" THEN "2012-06-01" ELSE "Beginn" END AS Beginn,
                      CASE WHEN "Ende" > '2012-06-30' THEN '2012-06-30' ELSE "Ende" End AS Ende
                      FROM "tabellel_test"
                      WHERE "Beginn" <= "2012-06-30" AND
                      "Ende" >= "2012-06-01"
                      [/HIGHLIGHT]

                      http://entwickler-forum.de/showthrea...LECT-Anweisung

                      Was meint Ihr?
                      Zuletzt editiert von Wolf-Tilmann; 08.11.2012, 07:44.
                      Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

                      Ach ja:
                      Daten lassen sich am Besten mit der Keule bearbeiten.

                      Comment


                      • #12
                        Hallo,
                        Originally posted by Wolf-Tilmann View Post
                        ...nur ist in der CASE-Anweisung ein Fehler...
                        Nicht nur in der Case-Anweisung!
                        Die Verwendung von " und ' ist in SQL nicht beliebig! In SQL kann man Bezeichner (also Aliase, Feld-, Tabellennamen etc.) in doppelte Anführungszeichen (") schreiben. Das muss man aber nur wenn diese Bezeichner Sonderzeichen enthalten (z.B. Umlaute, Leerzeichen) oder Gross-/Kleinschreibung beachtet werden soll. Literale kommen dagegen nur in EINFACHE Hochkommas ('). Du hast das in deinem Statement bunt gemischt, so dass hier der Parser ziemlich durcheinander kommt.

                        Gruß Falk
                        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                        Comment


                        • #13
                          Ja, stimmt,
                          mit meinerm SQLite funktioniert es.
                          Weil:

                          ich das nur gaaaaaanz dreckig abgetippt (ein Wunder, dass ich nicht mit " begonnen und mit ' abgeschlosssen) habe.

                          Wolf-Tilmann
                          Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

                          Ach ja:
                          Daten lassen sich am Besten mit der Keule bearbeiten.

                          Comment

                          Working...
                          X