none
SQL Statement Problem (Pivot) RRS feed

  • Allgemeine Diskussion

  • Hallo Forum,

    ich habe eigentlich gleich mehrere Probleme und bin leider recht unerfahren was T-SQL angeht, deswegen vorsotglich SORRY für die "dummen" Fragen.

    Zunächst: Ich soll diverse Views erstellen die schlußendlich über Sharepoint verteilt werden. Einer davon ist die Darstellung von Monteursressourcen aus unserem ERP System. Dort werden die Informationen die ich anzeigen soll weitgehend in zwei Tabellen abgelegt. Ich erkenne in Tabelle 1 um was für Aufträge es geht (Montage, Zeichnen, Werkstatt) und in Tabelle zwei werden die inhaltlichen Dinge wie Wunsch-Beginn, Wunsch-Ende, und vermutliche Dauer gespeichert.

    Legt also jemand einen Montageauftrag an, werden in Tabelle zwei mindestens drei Einträge, als je einzelner Datensatz, angelegt: In etwa so:

    TBL1:

    ProjektID; Name; bla bla...

    4711, Dr. Oetker, ...

    TBL2:

    ProjektID; Merkmal, Wert

    4711; Beginn; 01.10.2013

    4711;Ende; 24.12.2013

    4711; Auwand; 567

    Ich möchte nun ein Ergebnis bekommen das wie folgt aussieht:

    ProjektID, name, Beginn, Ende, Aufwand

    4711; Dr. oetker; 01.10.2013; 24.12.2013; 567

    trotz diverser Hinweise im Netz habe ich es nicht hinbekommen.

    Hinzu kommt, dass es in TBL2 für jede Auftragsart einen unterschiedlichen Eintrag für die oben Beschriebenen Werte gibt, als WBeginn (für Werkstattaufträge), WEnde, MBeginn (Montageaufträge), MEnde, ZBeginn (Zeichnungsaufträge) ...

    Wenn ich nun aus TBL1 erkenne um was für eine Auftragsart es sich handelt, wie erkenne ich dann, was für Datensätze ich aus TBL2 heranzihen muss?

    Ein Drama... ich verzweifele..

    Danke für jeden Hinweis

    Gruß

    Heiko

    Sonntag, 16. Juni 2013 12:39

Alle Antworten

  • Hallo Heiko,
    ich gehe mal davon aus, dass Du das Datenbankdesign nicht ändern kannst. Dadurch hast Du jetzt mit einigen Schwierigkeiten zu kämpfen, die eine elegante Lösung unmöglich machen. Hier ein Beispiel, was ich basierend auf Deinen Angaben erstellt habe. Schrecklich ist der Join mit dem CASE und den fest definierten Werten. Weiterhin können in Tabelle2 ja nur Strings als Wert abgelegt werden, da Du hier verschiedenste Informationen ablegen willst. Eine Plausi-Prüfung durch die Datenbank ist damit nicht mehr so einfach möglich.

    Declare @Tbl1 as Table(Produkt int, Name varchar(20), Art varchar(10));
    Declare @Tbl2 as Table(Produkt int, Merkmal varchar(20), Wert varchar(20));
    
    Insert into @Tbl1(Produkt, Name, Art) values(1, 'Projekt1', 'Montage');
    Insert into @Tbl1(Produkt, Name, Art) values(2, 'Projekt2', 'Zeichnen');
    Insert into @Tbl1(Produkt, Name, Art) values(3, 'Projekt3', 'Werkstatt');
    
    Insert into @Tbl2(Produkt, Merkmal, Wert) values(1, 'MBeginn',        'Datum
    MBeginn');
    Insert into @Tbl2(Produkt, Merkmal, Wert) values(1, 'MEnde',        'Datum
    MEnde');
    Insert into @Tbl2(Produkt, Merkmal, Wert) values(1, 'MAufwand', 'Wert
    MAufwand');
    
    Insert into @Tbl2(Produkt, Merkmal, Wert) values(2, 'ZBeginn',        'Datum
    ZBeginn');
    Insert into @Tbl2(Produkt, Merkmal, Wert) values(2, 'ZEnde',        'Datum
    ZEnde');
    Insert into @Tbl2(Produkt, Merkmal, Wert) values(2, 'ZAufwand', 'Wert
    ZAufwand');
    
    Insert into @Tbl2(Produkt, Merkmal, Wert) values(3, 'WBeginn',        'Datum
    WBeginn');
    Insert into @Tbl2(Produkt, Merkmal, Wert) values(3, 'WEnde',        'Datum
    WEnde');
    Insert into @Tbl2(Produkt, Merkmal, Wert) values(3, 'WAufwand', 'Wert
    WAufwand');
    
    Select t.*, a.Wert, b.Wert, c.Wert
    from @Tbl1 t
    left join @Tbl2 a on t.Produkt = a.Produkt and
    case
         when t.Art = 'Montage' then 'MBeginn'
         when t.Art = 'Zeichnen' then 'ZBeginn'
         when t.Art = 'Werkstatt' then 'WBeginn'
    end = a.Merkmal
    left join @Tbl2 b on t.Produkt = b.Produkt and
    case
         when t.Art = 'Montage' then 'MEnde'
         when t.Art = 'Zeichnen' then 'ZEnde'
         when t.Art = 'Werkstatt' then 'WEnde'
    end        = b.Merkmal
    left join @Tbl2 c on t.Produkt = c.Produkt and
    case
         when t.Art = 'Montage' then 'MAufwand'
         when t.Art = 'Zeichnen' then 'ZAufwand'
         when t.Art = 'Werkstatt' then 'WAufwand'
    end = c.Merkmal
    ;

     Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu/

    Montag, 17. Juni 2013 12:03
    Beantworter