Announcement

Collapse
No announcement yet.

SQLite - SOLL - ISt-Zahlenvergleich über mehrere Tabellen

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

  • SQLite - SOLL - ISt-Zahlenvergleich über mehrere Tabellen

    Einen schönen guten Abend,

    ich habe wieder einmal ein für mich größeres Problem.
    In SQLite habe ich mir folgende Tabelle angelegt:

    Code:
    CREATE TABLE "planung" (
    "Abteilung" TEXT NOT NULL ,
    "Unterabt" TEXT,
    "ArbGrp" TEXT,
    "Bereich" TEXT NOT NULL ,
    "Name" TEXT NOT NULL ,
    "Vorname" TEXT NOT NULL ,
    "EUR_Std" REAL,
    "Std_Mon" REAL NOT NULL ,
    "Beginn" DATETIME NOT NULL ,
    "Ende" DATETIME NOT NULL ,
    UNIQUE (Abteilung, Bereich, name, vorname, EUR_Std, Std_Mon, Beginn, Ende)
    )
    Über diesen View lasse ich mir die monatlichen Kosten ausgeben:
    Code:
    CREATE VIEW "monatszuordnung" AS          
    SELECT 
    DISTINCT ( strftime ( '%Y-%m' , monate . mstart ) ) AS Kal_Per , 
    strftime ( '%Y' , monate . mstart ) AS Kal_Jahr , 
    strftime ( '%m' , monate . mstart ) AS Kal_Mon , 
    monate.semester AS Semester,
    planung . Abteilung AS Abteilung , 
    planung . Unterabt AS Unterabt , 
    planung . ArbGrp AS ArbGrp , 
    planung . Bereich AS Bereich , 
    planung . Name AS Name , 
    planung.vorname AS Vorname, 
    CASE WHEN sapauszug . referenz IS NULL THEN ('ohne: '||Name||', '||Vorname) ELSE sapauszug.referenz END AS Persnr , 
    planung . EUR_Std AS EUR_STD , 
    planung . Std_Mon AS STD_MON , 
    planung . Beginn AS AV_Beginn , 
    planung . Ende AS AV_Ende , 
    CASE WHEN planung . Beginn > monate . mstart THEN planung . Beginn ELSE monate . mstart END AS M_Beginn , 
    CASE WHEN planung . Ende < monate . mende THEN planung . Ende ELSE monate . mende END AS M_Ende , 
    julianday ( CASE WHEN planung . Ende < monate . mende THEN planung . Ende ELSE monate . mende 
    END ) - julianday ( CASE WHEN planung . Beginn > monate . mstart THEN planung . 
    Beginn ELSE monate . mstart END ) + 1 AS Tage_Mon , 
    ROUND (( planung . EUR_STD * planung . Std_Mon * ( julianday ( CASE WHEN planung . Ende < monate . mende THEN planung . Ende ELSE monate . mende END ) - julianday ( CASE WHEN planung . Beginn > monate . mstart THEN planung . Beginn ELSE monate . mstart END ) + 1 ) / strftime ( '%d' , monate . mstart , '+1 month' , '-1 day' )*1.28) , 2 ) AS Gehalt_Mon 
    FROM 
    	planung , 
    	monate 
    LEFT JOIN sapauszug
    	ON sapauszug.namegp = (planung.Name||' '||planung.Vorname)
    WHERE 
    planung . Beginn <= monate . mende AND planung . Ende >= monate . mstart 
    ORDER BY 
         Referenz,
            Name, 
                Vorname
    Aus SAP hole ich mir monatlich eine Zusammenstellung aller tatsächlich angefallenen Kosten. Damit fülle ich folgende Tabelle:
    Code:
    CREATE TABLE "sapauszug" (
    "jahr" TEXT,
    "monat" TEXT,
    "fist" TEXT,
    "fonds" TEXT,
    "fipos" TEXT,
    "sachktotxt" TEXT,
    "fibeleg" TEXT,
    "nrgp" TEXT,
    "namegp" TEXT,
    "referenz" TEXT,
    "lohnart" TEXT,
    "sachbearb" TEXT,
    "belegkopf" TEXT,
    "posttext2" TEXT,
    "anlagenr" TEXT,
    "anlage" TEXT,
    "benutzer" TEXT,
    "betrag" REAL,
    "buchdat" DATETIME,
    "fuerperiode" DATETIME,
    "redat" DATETIME
    )
    Jetzt muss ich die PLAN-zahlen mit den IST-Zahlen vergleichen.
    Das ist mein Problem. Die IST-zahlen werden gelegentlich mehrfach addiert, meist aber so wie sie tatsächlich angefallen sind.
    Code:
    CREATE VIEW DifferenzenPersMon AS 
    SELECT 
    monatszahlungen_IST.Fuerperiode AS IFuerperiode,
    monatszuordnung.Semester AS Semester,
    monatszuordnung.Abteilung AS Abteilung,
    monatszuordnung.Unterabt AS Unterabt,
    monatszuordnung.Kal_Per AS SKAL,
    monatszahlungen_IST.KalPer AS IKAL,
    monatszuordnung.PersNr AS MPersNr,
    monatszahlungen_IST.PersNr AS IPersNr,
    monatszuordnung.Name AS MName,
    monatszuordnung.Vorname AS MVorname,
    monatszahlungen_IST.GPartner AS IPartner,
    monatszuordnung.Gehalt_Mon AS SGehalt,
    monatszahlungen_IST.Gehalt AS IGehalt,
    ROUND(monatszuordnung.Gehalt_Mon - monatszahlungen_IST.Gehalt,2) AS Differenz
    FROM monatszuordnung, monatszahlungen_IST
    WHERE 
    monatszuordnung.PersNr = monatszahlungen_IST.PersNr AND
    monatszuordnung.Kal_Per  = monatszahlungen_IST.KalPer
    ORDER BY IFuerperiode, Semester, Unterabt, MName, Mvorname
    Wie bekomme ich es hin, dass stets nur jede Zeile in sapauszug einfach ausgewertet wird?

    Info: die Zahlen in Fuerperiode setzen sich aus mehreren Zeilen zusammen.

    Ich weiß, eigentlich müsste jede Tabelle eine ID-Spalte haben, aber …

    Vielen Dank schon einmal

    Wolf-Tilmann
    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
    Das ist mein Problem. Die IST-zahlen werden gelegentlich mehrfach addiert, meist aber so wie sie tatsächlich angefallen sind.
    Wie bekomme ich es hin, dass stets nur jede Zeile in sapauszug einfach ausgewertet wird?

    Info: die Zahlen in Fuerperiode setzen sich aus mehreren Zeilen zusammen.
    Die Erklärung ist mir etwas unverständlich.
    Mehrfach addiert? Die Zahlen der (Spalte!) Fueroeriode setzen sich aus mehreren Zeilen zusammen?

    Grundsätzlich:
    Ein soll/ist Vergleich per SQL funktioniert nur dann, wenn per Kriterium eine eindeutige Verbindung der Mengen hergestellt werden kann. Demzufolge müssen beide Datenmengen vor allem dublettenfrei sein (bezogen auf die zu joinenden Schlüsselfelder). Außerdem müssen fehlende Werte (auf beiden Seiten) durch ein geeignetes Join Konstrukt berücksichtigt werden (zb. full outer, ..).
    Gruß, defo

    Comment

    Working...
    X