Announcement

Collapse
No announcement yet.

SQL-Detaildaten in einer Zeile

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

  • SQL-Detaildaten in einer Zeile

    Guten Tag aus Bremen!

    Ich habe folgendes Problem.

    Ich habe zwei Tabellen. Z.B eine Kundentabelle und eine Tabelle mit den Telefonnummern. Beide Tabellen stehen über eine ID und PersID in Relation.
    Code:
    ID:          Name:
    1             Max
    2             Hans
    
    ID:           PersID:      Telefon:
    1              1               1111
    2              1               2222
    3              2               3333
    4              2               4444
    5              2               5555
    Jetzt möchte ich die folgende Darstellung erreichen:
    Code:
    ID:           Name:          Telefon1:        Telefon2:        Telefon3:
    1              Max              1111               2222
    2              Hans            3333               4444               5555

    Das Problem besteht darin, dass die Anzahl der Detaildatensätze nicht konstant ist. Eine Person kann 2 Telefonnummern haben, die andere 5.
    Somit komme ich mit normalem Pivoting nicht zum Ziel.
    Da ich das Ergebnis der Abfrage gleich weiterverarbeiten möchte, kann ich das Ergebnis auch nicht in der GUI (Array) erstellen.
    Ist soetwas mit SQL ohne Transact, StoredProcedures o.ä machbar?

  • #2
    Originally posted by Jens Reiber View Post
    Somit komme ich mit normalem Pivoting nicht zum Ziel.
    Warum nicht?[HIGHLIGHT="SQL"]WITH names
    ( ID
    , Name
    )
    AS ( SELECT 1, 'Max' UNION ALL
    SELECT 2, 'Hans'
    )
    , numbers
    ( ID
    , PersID
    , Telefon
    )
    AS ( SELECT 1, 1, 1111 UNION ALL
    SELECT 2, 1, 2222 UNION ALL
    SELECT 3, 2, 3333 UNION ALL
    SELECT 4, 2, 4444 UNION ALL
    SELECT 5, 2, 5555
    )
    SELECT X.PersID
    , X.Name
    , MAX (CASE WHEN X.Row = 1 THEN Telefon END) AS Telefon1
    , MAX (CASE WHEN X.Row = 2 THEN Telefon END) AS Telefon2
    , MAX (CASE WHEN X.Row = 3 THEN Telefon END) AS Telefon3
    , MAX (CASE WHEN X.Row = 4 THEN Telefon END) AS Telefon4
    , MAX (CASE WHEN X.Row = 5 THEN Telefon END) AS Telefon5
    FROM ( SELECT ROW_NUMBER () OVER (PARTITION BY PersID ORDER BY Telefon) AS Row
    , Numbers.PersID
    , Names.Name
    , Numbers.Telefon
    FROM Names
    JOIN Numbers on names.ID = numbers.PersID
    ) AS X
    GROUP BY X.PersID
    , X.Name
    [/HIGHLIGHT]
    Beispiel mit SQL 2005 und höher...
    Einzige Einschränkung:
    Du bekommst nur soviele Spalten zurück wie "MAX (CASE ..." Du hast...
    (das ginge dann nur über eine Stored Procedure und Dynamic SQL...)

    Comment


    • #3
      Hmm,
      Danke! Das ist zumindest eine Richtung, in die weitergedacht werden kann.

      Wie du schon sagst, bekommt man in diesem Fall nur 5 Telefon-Spalten zurück. Damit kann ich leben.
      Leider möchte sich der Kunde nicht auf eine Datenbank festlegen. Eine Lösung die sich auf den SQL-Standard beschränkt ist wohl leider nicht möglich.

      Danke trotzdem.

      Comment


      • #4
        Das ist noch alles SQL-Standard, allerdings der von 2003 und den unterstützen noch nicht alle RDBMS
        (auch MS-SQL-Server nicht vollständig)

        Comment


        • #5
          Genau.
          Auf meinem MSSQL2005 läuft der Vorschlag von dir auch super.
          Zur Zeit nutzt der Kunde noch ein Access-Backend (leider). Wohin die Reise mit dem DBMS gehen wird ist nicht bekannt. Ich Arbeite hier mit ADO per JetEngine auf Access2003.
          Ich werde das Ergebnis wohl doch in der GUI Umformen müssen.

          Comment

          Working...
          X