Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Mehrere Zeilen zusammenfassen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Mehrere Zeilen zusammenfassen

    Hallo,

    Um einen Export fertigzustellen, benötige ich Informationen aus mehreren Zeilen zusammengefasst. Es geht um Zuordnungen von Artikeln zu Kategorien.

    Ausgangssituation
    Ich habe eine Tabelle mit folgenden Spalten:
    Code:
    ItemId, CategoryId, SortId
    Ein Item kann natürlich in beliebig vielen Kategorien vorhanden sein. Die SortId ist eine Sortierung, die das Item in der entsprechenden Kategorie hat.

    Die Problematik
    Ein Item ist in dieser Tabelle nun in genau so vielen Zeilen enthalten, wie er in verschiedenen Kategorien vorkommt.
    Für den oben erwähnten Export muß ich nun die CategoryId's und SortId's wie folgt zusammenfassen:
    Code:
    Beispiel: ItemId foo ist in Kategorie B, F und Y vorhanden und hat entsprechend die Sortierungen 100, 200, 300
    
    Datensätze:
    foo|B|100
    foo|F|200
    foo|Y|300
    
    Ergebnis soll sein ( Export-Vorgabe ):
    B=>100,F=>200,Y=>300
    
    also alles in einem Feld!
    Ich habe das über Pivot versuchen wollen oder über Aggregat-Funktionen, aber bei beiden Varianten müsste ich immer erst wissen, wie viele Datensätze es mit dem Item gibt.

    Ich bin geneigt, es in eine Funktion auszulagern, die per Cursor die Datenzeilen zu der ItemId durchläuft und zusammengefasst zurückgibt.
    Allerdings sind Cursor nicht gerade mit Performance beseelt, daher hoffe ich auf andere Varianten, auf die ich nicht komme.

    Es handelt sich um T-SQL ( MSSQL-Server 2008 ), aber evtl. hilft mir ja auch die Vorgehensweise anderer Datenbanken, das bei mir mit Anpassungen abzubilden.

    Danke
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages


  • #2
    In MySQL wäre die Lösung in etwa so:
    Code:
    SELECT 
      ItemId, 
      GROUP_CONCAT(CONCAT(CategoryId,'=>',SortId) SEPARATOR ',') 
    FROM 
      artikelkat 
    GROUP BY 
      ItemId
    LG jspit
    PHP-Klassen auf github

    Kommentar


    • #3
      Ich danke Dir, das hat mich auf den richtigen Weg gebracht! Alternativ zu GROU_CONCAT muß man das bei T-SQL über ne XML lösen:
      Code:
      SELECT
        ItemId,
        REPLACE(
          STUFF(
            (
              SELECT
                ',' + CAST( CategoryId AS VARCHAR(15) )
                +  '==' + CAST( SortId AS VARCHAR(10) )
              FROM table
              WHERE ItemId = tbl_alias.ItemId
              FOR XML PATH('')
            ), 1, 1, ''
          )
          , '=='
          , '=>'
        )
      FROM
          table tbl_alias
      GROUP BY
          tbl_alias.ItemId
      Ob's nen eleganteren Weg gibt weiß ich nicht, aber so passt's für meinen Export.
      Competence-Center -> Enjoy the Informatrix
      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

      Kommentar


      • #4
        Zitat von jspit Beitrag anzeigen
        In MySQL wäre die Lösung in etwa so:
        In PG könntest Du übrigens bei Aggregationen diese auch noch in einer Sortierreihenfolge durchgehen, bei solchen String-Aggregationen kann dies durchaus wünschenswert sein. Ansonsten bekommst Du ein zufällig sortiertes Resultat.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Guter Einwand, danke. Für den Zweck ist die Sortierung allerdings vernachlässigbar.
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar

          Lädt...
          X