none
Einfügen/Aktualisieren einer Tabelle RRS feed

  • Frage

  • Hallo zusammen,

    ich habe eine Frage, und zwar möchte ich eine Tabelle aufbauen bestehend aus PC-Name in der ersten Spalte sowie ein Eintrag in den weiteren 10 Spalten je nach vorhandener Version von Dateien.

    Ich habe eine Tabelle in der für jede Programmversion die Datei-Version enthalten ist, ein PC kann hier mehr als einmal vorkommen, je nachdem wie viele Versionen auf dem Gerät sind.

    Benötigt ist nun eine Tabelle die den PC-Namen nur einmal aufführt, die verschiedenen Versionen aber in den weiteren 10 Spalten enthält.

    Beispiel:
    PC001  0  1  1  0  0  0  1  1  0  0
    PC002 ...

    Für PC001 gilt das vier Datensätze enthalten sind, also pro Version ein Datensatz.

    Ich habe verschiedene Versuche durch, als erstes habe ich per distinct eine Tabelle gefüllt (jeder PC nun einmal enthalten), dann 10 Update gefahren. Das scheint mir etwas am Ziel vorbei.

    Geht sowas besser?

    Kann man ein Update machen, das alle Daten von einem Select erhält und dann über Case/When dann die Spalte ansprechen?

    Viele Grüsse;
    Maximilian

    Donnerstag, 16. Februar 2012 20:09

Antworten

  • Ich bin mir nicht sicher, ob ich dich richtig verstehe, aber du kannst etwas in dieser Richtung machen:

    UPDATE
        PC
    SET
        PC.Spalte1 = CASE WHEN ....,
        PC.Spalte2 = CASE WHEN ...
    FROM
        SELECT
            ...
        FROM
            Tabelle PC
        WHERE
            ...                        



    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org

    • Als Antwort markiert MaxiTesch Sonntag, 19. Februar 2012 20:16
    Freitag, 17. Februar 2012 07:28
  • Hallo Maximilian,

    zunächst einmal rate ich davon ab, das Ergebnis der Abfrage in eine neue Tabelle zu schreiben. Eine Sicht reicht völlig aus. Anderenfalls müßtest Du jede Änderung der Quelltabelle in der neuen Zieltabelle nachführen. Dies aber nur am Rande...

    Zur ursprünglichen Frage: Am einfachsten geht es mit einer Kreuztabellen-Abfrage (siehe Beispiel). Alternativ auch mit PIVOT (ab SQL 2008), ist aber nach meiner Erfahrung nicht nur syntaktisch "gewöhnungsbedürftig", sondern auch hinsichtlich Performance etwas schwächer.

    DECLARE @tbl TABLE
    (
    	ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    	PCName CHAR(5),
    	VersionName VARCHAR(10)   
    )
    INSERT INTO @tbl (PCName,VersionName)
    VALUES ('PC001','Version2'),
    ('PC001','Version3'),
    ('PC001','Version7'),
    ('PC001','Version8'),
    ('PC002','Version1'),
    ('PC002','Version2'),
    ('PC002','Version3')
    
    SELECT  
    	PCName,
    	MAX(CASE WHEN VersionName = 'Version1' THEN 1 ELSE 0 END) Version1,
    	MAX(CASE WHEN VersionName = 'Version2' THEN 1 ELSE 0 END) Version2,
    	MAX(CASE WHEN VersionName = 'Version3' THEN 1 ELSE 0 END) Version3,
    	MAX(CASE WHEN VersionName = 'Version4' THEN 1 ELSE 0 END) Version4,
    	MAX(CASE WHEN VersionName = 'Version5' THEN 1 ELSE 0 END) Version5,
    	MAX(CASE WHEN VersionName = 'Version6' THEN 1 ELSE 0 END) Version6,
    	MAX(CASE WHEN VersionName = 'Version7' THEN 1 ELSE 0 END) Version7,
    	MAX(CASE WHEN VersionName = 'Version8' THEN 1 ELSE 0 END) Version8,
    	MAX(CASE WHEN VersionName = 'Version9' THEN 1 ELSE 0 END) Version9,
    	MAX(CASE WHEN VersionName = 'Version10' THEN 1 ELSE 0 END) Version10
    FROM   @tbl
    GROUP BY PCName;

    • Als Antwort markiert MaxiTesch Sonntag, 19. Februar 2012 20:16
    Sonntag, 19. Februar 2012 14:12

Alle Antworten

  • Ich bin mir nicht sicher, ob ich dich richtig verstehe, aber du kannst etwas in dieser Richtung machen:

    UPDATE
        PC
    SET
        PC.Spalte1 = CASE WHEN ....,
        PC.Spalte2 = CASE WHEN ...
    FROM
        SELECT
            ...
        FROM
            Tabelle PC
        WHERE
            ...                        



    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org

    • Als Antwort markiert MaxiTesch Sonntag, 19. Februar 2012 20:16
    Freitag, 17. Februar 2012 07:28
  • Hallo Maximilian,

    zunächst einmal rate ich davon ab, das Ergebnis der Abfrage in eine neue Tabelle zu schreiben. Eine Sicht reicht völlig aus. Anderenfalls müßtest Du jede Änderung der Quelltabelle in der neuen Zieltabelle nachführen. Dies aber nur am Rande...

    Zur ursprünglichen Frage: Am einfachsten geht es mit einer Kreuztabellen-Abfrage (siehe Beispiel). Alternativ auch mit PIVOT (ab SQL 2008), ist aber nach meiner Erfahrung nicht nur syntaktisch "gewöhnungsbedürftig", sondern auch hinsichtlich Performance etwas schwächer.

    DECLARE @tbl TABLE
    (
    	ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    	PCName CHAR(5),
    	VersionName VARCHAR(10)   
    )
    INSERT INTO @tbl (PCName,VersionName)
    VALUES ('PC001','Version2'),
    ('PC001','Version3'),
    ('PC001','Version7'),
    ('PC001','Version8'),
    ('PC002','Version1'),
    ('PC002','Version2'),
    ('PC002','Version3')
    
    SELECT  
    	PCName,
    	MAX(CASE WHEN VersionName = 'Version1' THEN 1 ELSE 0 END) Version1,
    	MAX(CASE WHEN VersionName = 'Version2' THEN 1 ELSE 0 END) Version2,
    	MAX(CASE WHEN VersionName = 'Version3' THEN 1 ELSE 0 END) Version3,
    	MAX(CASE WHEN VersionName = 'Version4' THEN 1 ELSE 0 END) Version4,
    	MAX(CASE WHEN VersionName = 'Version5' THEN 1 ELSE 0 END) Version5,
    	MAX(CASE WHEN VersionName = 'Version6' THEN 1 ELSE 0 END) Version6,
    	MAX(CASE WHEN VersionName = 'Version7' THEN 1 ELSE 0 END) Version7,
    	MAX(CASE WHEN VersionName = 'Version8' THEN 1 ELSE 0 END) Version8,
    	MAX(CASE WHEN VersionName = 'Version9' THEN 1 ELSE 0 END) Version9,
    	MAX(CASE WHEN VersionName = 'Version10' THEN 1 ELSE 0 END) Version10
    FROM   @tbl
    GROUP BY PCName;

    • Als Antwort markiert MaxiTesch Sonntag, 19. Februar 2012 20:16
    Sonntag, 19. Februar 2012 14:12
  • Hallo Frank,

    vielen Dank für die Info, ich habe das als erstes verwendet, dann gemerkt das er in meinem Fall NULL in de Tabelle schreibt und bestehende Werte dann überschreibt. Gelöst habe ich dieses Problem dann mit when und else, bei else habe ich den bestehenden Feldinhalt wieder zugewiesen.

    Nachdem alles fertig war, musste ich eine weitere Version einfügen, das sah dann irgendwann auch etwas unübersichtlich aus, darauf hatte ich dann doch eher eine Case/When/Else Abfrage erstellt, die Programmversion einer Variablen zugewiesen und dann zum Schluss ein Update-Command in einer Variablen zusammengebaut. Diese dann per EXEC ausgeführt, somit ist das erst mal gelöst.

    Vielen Dank nochmal,
    Maximilian

    Sonntag, 19. Februar 2012 20:15
  • Hallo,

    ich habe zwar mein Problem für jetzt gelöst, aber Dein Beitrag sieht auch recht flexibel aus, werde das morgen mal testen und umsetzen.

    Vielen Dank,
    Maximilian

    Sonntag, 19. Februar 2012 20:16