Announcement

Collapse
No announcement yet.

Datensätze anhand zweier Parametern teilen und in Spalte schreiben ?

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

  • Datensätze anhand zweier Parametern teilen und in Spalte schreiben ?

    Hallo

    ich habe eine Tabelle mit folgendem Aufbau (vereinfacht):

    ID|PLZ|JA/Nein| Datum
    1|12345|nein| 31.12.2006
    1|12345|ja|31.07.2007
    2|12345|ja|31.07.2007
    3|12345|ja|31.12.2006

    Ich benötige eine Abfrage (PLSQL) um eine Gegenüberstellung (Vergleich) zu div. Zeitpunkten abbilden zu können.

    Die Abfrage soll also folgendes Ergebnis liefern:

    ID|PLZ|31.12.2006(Parameter)|31.07.2007(Parameter)
    1|12345|nein|ja
    2|12345|NULL|ja
    3|12345|ja|NULL

    Lösungsansatz:

    Ich bin da jetzt schon lange dran und habe irgendwie noch keine richtige Lösung gefunden. Ursprünglich wollte ich zuerst die
    Ergebnismenge des ersten Parameters in ein Inline-View verpacken und diese mit dem zweiten Parameter verknüpfen.
    Allerdings bin ich dabei nicht wirklich weit gekommen (mag vielleicht auch daran liegen, daß ich seit 3 Jahren kein
    SQL-Statement mehr geschrieben habe und es doch etwas eingerostet ist ). Vielleicht ist dies aber auch der falsche Weg.

    Also plz help me und lasst hören was die hiesigen SQL-Gurus dazu sagen

  • #2
    Hallo,

    eine Lösung für den MS SQL Server könnte so aussehen:

    Code:
    USE tempdb
    GO
    
    CREATE TABLE Sqlnoob
    (
      id    INT        NOT NULL,
      plz   VARCHAR(5) NOT NULL,
      b     VARCHAR(4) NOT NULL,
      datum DATETIME   NOT NULL
    )
    GO
    INSERT INTO dbo.Sqlnoob VALUES (1,12345,'nein','31.12.2006')
    INSERT INTO dbo.Sqlnoob VALUES (1,12345,'ja','31.07.2007')
    INSERT INTO dbo.Sqlnoob VALUES (2,12345,'ja','31.07.2007')
    INSERT INTO dbo.Sqlnoob VALUES (3,12345,'ja','31.12.2006')
    GO
    
    SELECT id,plz,
      MAX(CASE WHEN datum = '31.12.2006' THEN b END) AS 'Param1',
      MAX(CASE WHEN datum = '31.07.2007' THEN b END) AS 'Param2'
    FROM dbo.Sqlnoob 
    GROUP BY id,plz
    GO
    Das Ergebnis sieht so aus:

    Code:
    id          plz   Param1 Param2
    ----------- ----- ------ ------
    1           12345 nein   ja
    2           12345 NULL   ja
    3           12345 ja     NULL
    Um die beiden Datumswerte als Parameter einbauen zu können, ist eine User-Defined Function (UDF) ein geeigneter Weg:

    Code:
    CREATE FUNCTION fnSqlnoob
    (
      @datum1 DATETIME,
      @datum2 DATETIME
    ) 
    RETURNS @tbl TABLE (id INT, plz VARCHAR(5), param1 VARCHAR(4), param2 VARCHAR(4))
    AS
      BEGIN
        INSERT INTO @tbl  
          SELECT id,plz,
             MAX(CASE WHEN datum = @datum1 THEN b END) AS 'Param1',
             MAX(CASE WHEN datum = @datum2 THEN b END) AS 'Param2'
          FROM dbo.Sqlnoob 
          GROUP BY id,plz
        RETURN;
      END
    GO
    
    -- Testen
    SELECT * FROM dbo.fnSqlnoob('31.12.2006', '31.07.2007')
    GO
    Zuletzt editiert von Andreas Kosch; 10.07.2007, 06:46.

    Comment


    • #3
      Hey prima, das funktioniert ja und war eigentlich garn nicht schwer; Schande über mich, das ich da nicht selbst drauf gekommen bin.

      Vielen Dank für die Hilfe

      Comment

      Working...
      X