[MSSQL] Historisierung

Termos

Mitglied
Hallo Community,

Ich habe das folgende Problem.

Es soll eine Historisierung in einer MS SQL Abfrage stattfinden um das Ergebnis in einem Cube abzubilden.
Die Ausgangstabelle nach SubSelect hat folgende Form.

Personal; Datum; Kostenstelle; Abteilung; Status; Abrechngruppe; Kennzahlen; #Value
Mitarbeiter A; 01.2015; 400000;AB;X;A_V;Preis;400


Über das Datum möchte ich nun eine zweite Tabelle Joinen, welche die Form

Personal; VON;BIS;Abteilung besitzt (NUP_Abteilungzeit)
Mitarbeiter A;01.01.2015;28.02.2015;Abteilung1
Mitarbeiter A;01.03.2015;NULL -> Hier benutze ich CASE mit (GETDATE()) um das aktuelle Datum einzutragen (Im Unteren Beispiel nicht inbegriffen); Abteilung2


Was bekomme ich als Ergebnis:

Mitarbeiter A 01.2015 52100 FR Arbeiter U_P I-Kosten 400 Abteilung1
Mitarbeiter A 02.2015 52100 FR Arbeiter U_P I-Kosten 400 NULL -> Hier ist das Problem!!!
Mitarbeiter A 03.2015 52100 FR Arbeiter U_P I-Kosten 400 Abteilung2

Mein eigentlicher Ansatz ist ein Join über einen Kalender der mir Dann pro Monat die Abteilung dahinter schreibt -> Select * from A Left Join Kalender d on d.datum between a.von AND a.bis
- leider bekomm ich das ganze so auch nicht zum laufen, habt ihr evtl eine Idee oder einen anderen Lösungsansatz?

Zusammengefasst: Ich habe ein Datum im Format mm.yyyy und ein VON BIS Datum im Format dd.mm.yyyy
Alle Monate dazwischen sollen ausgegeben werden und die Abteilung dazu stehen.

01.01.2015 bis 31.05.2015 Abteilung X

=> 01.2015 Abteilung x
=> 02.2015 Abteilung x
=> 03.2015 Abteilung x
=> 04.2015 Abteilung x
=> 05.2015 Abteilung x
....

Hoffentlich ein wenig verständlich, vielen Dank



SQL:
SELECT a.*,b.ABTEILUNG FROM
(
SELECT         
            CASE WHEN p.Personal IS NULL THEN 'Sonstiges' ELSE p.PERSONAL END AS Personal,
 
           
            RIGHT('00' + CONVERT(VARCHAR(2),labr.AbrMon),2) + '.' +CONVERT(VARCHAR(4),labr.AbrJahr) as Datum,     
        
            p.PZEKOST as 'Kostenstelle',
            p.ABTEILUNG as 'Abteilung',
           
            --Logik um Arbeiter/Angestellte/Geringfügig/Azubi/Leiharbeiter zu unterteilen
            CASE p.ABRECHNGRUPPE
                  WHEN 'A_AZUBI' THEN 'Azubi'
                  WHEN 'U_AZUBI' THEN 'Azubi'
                  WHEN 'A_GB' THEN 'Gering'
                  WHEN 'U_GB' THEN 'Gering'
                  ELSE
                        CASE p.ABTEILUNG
                             WHEN 'EK' THEN 'Arbeiter'
                             WHEN 'EQ' THEN 'Angestellter'
                             WHEN 'EP' THEN 'Angestellter'
                             WHEN 'FK' THEN 'Angestellter'
                             WHEN 'FP' THEN 'Angestellter'
                             WHEN 'K' THEN 'Angestellter'
                             WHEN 'GF' THEN 'Angestellter'
                             WHEN 'QMB' THEN 'Angestellter'
                             WHEN 'GLA' THEN 'Angestellter'
                             WHEN 'P' THEN 'Angestellter'
                             WHEN 'E' THEN 'Angestellter'
                             WHEN 'F' THEN 'Angestellter'
                             WHEN 'FP' THEN 'Angestellter'
                             WHEN 'FK' THEN 'Angestellter'
                             WHEN 'V' THEN 'Angestellter'
                             WHEN 'KB' THEN 'Angestellter'
                             WHEN 'KC' THEN 'Angestellter'
                             WHEN 'KI' THEN 'Angestellter'
                             WHEN 'KE' THEN 'Angestellter'           
                  ELSE 'Arbeiter'
            END END as 'Status',
            p.Abrechngruppe,
 
            'I-Kosten' as 'Kennzahlen',
            LAbr.KV_AG + LAbr.RV_AG + LAbr.AV_AG + LAbr.PV_AG + LAbr.U2 + LAbr.IGU + LAbr.BruttoEBVO as #Value
FROM  
            lohn.dbo.Arbeitnehmer La
            left join lohn.dbo.ANMonatswerte_Abrech LAbr on La.ANNr = LAbr.ANNr AND La.MDNr = LAbr.MDnr
            left join APplusprod.dbo.PERSONAL p on convert(varchar(4),La.ANNr) = convert(varchar(4),p.LOHNNR)
            AND convert(varchar(4),p.LOHNNR) = convert(varchar(4),LAbr.ANNr)
            AND convert(varchar(1),LAbr.MDNr) = CASE WHEN p.LOHNMANDANT = 'ALU' THEN 1 ELSE 2 END
            AND convert(varchar(1),La.MDNr) = CASE WHEN p.LOHNMANDANT = 'ALU' THEN 1 ELSE 2 END    
     
           
WHERE LAbr.AbrJahr = '2015' AND LAbr.MDNr IN ('1','2') AND p.ABTEILUNG NOT IN ('ALTR','UFT') AND KoNr != '2'
      
) as A LEFT join  APplusProd.dbo.Nup_Abteilungzeit b on a.Personal = b.Personal AND a.Datum >= SUBSTRING(convert(varchar(10),b.VON,104),4,7) AND a.Datum <= SUBSTRING(convert(varchar(10),b.VON,104),4,7)
 
            group by 
                    a.Datum,   
                    a.Personal,
                    A.Kostenstelle,
                    A.ABRECHNGRUPPE,
                    A.ABTEILUNG, 
                    A.Status,
                    A.Kennzahlen,
                    b.ABTEILUNG,
                    A.#Value
            order by Personal
 
Ich habe das Proble meider nicht wirklich verstanden. Aber. Für deine Zuteilingen zu Azubi, Gering, Arbeiter und Angestellter solltest du dir Tabellen erstellen und ncith mittels CASE hasrdcodieren.

Diese 'Zweite Tabelle'. Welchi im SQL ist das? Dort sind drei Tabellen drin.
Und dieses Ausgabefeld mit Null. Wie heisst das?
 
Zurück