2017-06-20 3 views
1

ich eine Tabelle mit mehreren Zeilen pro Artikelnummer haben alsoTrans Zeilen in Spalten

Itemno Component Fabric  Fabric % 
------ --------- ------  -------- 
1  Back  Cotton  100 
1  Face  Viscose 67 
1  Face  Nylon  27 
1  Face  Elastane 6 
2  Main  Cotton  100 
3  Back  Nylon  50 
3  Back  Viscose 50 
3  Face  Cotton  100 

Ich möchte diese pro Artikelnummer in einer Zeile zu transformieren, um die Komponente verketten, Stoff & Stoff% Spalten in einer neuen Spalte . Dies wäre mit PIVOT einfach, aber die zusätzliche Komplikation ist, dass ich die Komponentenspalte nicht wiederholen möchte, wenn zwei gleich sind.

EDIT - vergessen zu erwähnen, wenn es mehrere Stoffe gibt, möchte ich, dass sie vom größten zum kleinsten geordnet sind.

das obige Beispiel ist die Ausgabe ich will, ist:

Itemno Composition 
------ ----------- 
1  Back 100% Cotton, Face 67% Viscose, 27% Nylon, 6% Elastane 
2  Main 100% Cotton 
3  Back 50% Nylon, 50% Viscose, Face 100% Cotton 

Vielen Dank im Voraus!

EDIT - Ich verwende Microsoft SQL Server 2012!

+1

Ich würde annehmen, dass Sie STUFF verwenden, um die begrenzte Liste zu erzeugen? Überspringen Sie einfach die Komponente in diesem Teil und verketten Sie die Komponente an den Anfang der Liste mit Trennzeichen. –

+0

Sie brauchen eine Kombination von ** listagg (..) ** Funktion – Frank

+0

@Frank das ist mit sql Server getaggt, Listagg ist für Oracle, wenn ich mich richtig erinnere. –

Antwort

1

Mit STUFF erstellen Sie eine Liste mit Trennzeichen. Sie müssen nur eine Zwischenliste der einzelnen Komponenten erstellen.

So etwas sollte für Sie arbeiten.

DECLARE @Something TABLE 
(
    ItemNo INT 
    , Component VARCHAR(10) 
    , Fabric VARCHAR(20) 
    , FabricPercent INT 
) 

INSERT @Something 
(
    ItemNo, 
    Component, 
    Fabric, 
    FabricPercent 
) 
VALUES 
(1, 'Back', 'Cotton', 100), 
(1, 'Face', 'Viscose', 67), 
(1, 'Face', 'Nylon', 27), 
(1, 'Face', 'Elastane', 6), 
(2, 'Main', 'Cotton', 100), 
(3, 'Back', 'Nylon', 50), 
(3, 'Back', 'Viscose', 50), 
(3, 'Face', 'Cotton', 100) 
; 

WITH GroupedComponents AS 
(
    SELECT s.ItemNo 
     , s.Component + STUFF((SELECT ', ' + CONVERT(VARCHAR(4), s2.FabricPercent) + '% ' + s2.Fabric 
       FROM @Something s2 
       WHERE s2.ItemNo = s.ItemNo 
        AND s2.Component = s.Component 
       ORDER BY s2.FabricPercent DESC 
       FOR XML PATH('')), 1, 1, '') AS Composition 
    FROM @Something s 
    GROUP BY s.ItemNo, s.Component 
) 

SELECT gc.ItemNo 
    , STUFF((SELECT ', ' + gc2.Composition 
      FROM GroupedComponents gc2 
      WHERE gc2.ItemNo = gc.ItemNo 
      FOR XML PATH('')), 1, 1,'') AS FullComposition 
FROM GroupedComponents gc 
GROUP BY gc.ItemNo 
+0

Scheint ein Leckerbissen zu sein, danke Sean! – Paul

+0

Wenn dies funktioniert, sollten Sie dies als die Antwort markieren. Freut mich zu hören, dass es tut, was Sie wollen. –