2017-05-06 2 views
0

Version: Microsoft SQL Server 2014SQL Server: Werte sortieren In LIKE Spalten mit dynamischem Dreh

Ich habe erfolgreich eine dynamische Pivot-Tabelle (mit Hilfe) erstellt, und jetzt habe ich eine Frage in Bezug auf die Spaltennamen und deren Werte .

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 

SELECT @cols = STUFF((SELECT distinct ',' 
         + QUOTENAME('Component_' + cast(rn as varchar(10))) 
         FROM dbo.table 
         CROSS APPLY 
          (SELECT row_number() over(partition by UPC order by ComponentNum) rn 
          FROM dbo.table) x 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SET @query = 'SELECT UPC, ' + @cols + ' FROM 
      (
       SELECT UPC, ComponentNum, 
        ''Component_'' 
        + cast(row_number() over(partition by UPC order by ComponentNum) as varchar(10)) val 
       FROM dbo.table) x 
      PIVOT 
      (
       MAX(ComponentNum) 
       FOR val IN (' + @cols + ') 
      ) p ' 

execute(@query) 

Nachdem der Tisch geschwenkt wurde, erstellt es 27 Spalten von Component_X.

Die 27 Spalten sollen verschiedene Arten von Teilen darstellen, die einer eindeutigen UPC-Nummer zugeordnet sind. Nicht alle UPCs haben 27 Arten von Teilen.

Es scheint, dass abhängig davon, welche Zeilennummer das Teil in der partitionierten Gruppe von UPC-Nummern aufgelistet wurde, wo es in der Pivot-Spalte zugewiesen wurde.

Das bedeutet für mich, dass ich die ursprünglichen Daten sortieren muss, bevor ich den Pivot starte, nein? In der folgenden Ergebnistabelle sehen Sie, dass die Teilenummer 543 unter Component_13, Component_1 und Component_10 für verschiedene UPC-Nummern angezeigt wird.

ID   UPC  Component_13  Component_1  Component_10  
------------------------------------------------------------------------ 
1   123  543     NULL    345 
2   321  345     543     765 
3   213  654     345     NULL   
4   312  765     NULL    543 

Mein Problem ist, dass ich nicht die Teilenummer erlauben kann zwischen verschiedenen Spalten zu schweben. Wenn die Teilenummer ein "Component_13" Typ ist, muss sie in dieser Spalte bleiben.

Mein Ziel ist es, jede Iteration von Component_X eine bestimmte Art von Teil darzustellen.

Component_1 = Bolts 
Component_2 = Nuts 
Component_3 = Washers 

Das andere Problem ist, dass ich müssen auch mehrere „Bolt“ Teilenummern in ihre eigene Spalte für den Abruf durch ein anderes Stück Software aufzuzählen. Jede UPC-Nummer kann eine beliebige Anzahl von "Schrauben" unterschiedlicher Größe mit unterschiedlichen Teilenummern haben.

End Ergebnis Tabelle könnte wie folgt aussehen:

ID   UPC  Bolt1  Bolt2  Bolt3  Nut1  Nut2  
------------------------------------------------------------------------ 
1   123  1.5   1   NULL  0.5  .375 
2   321  2.0  NULL  NULL  .625  NULL  
3   213  0.25  .875  .375  NULL  NULL   
4   312  NULL  NULL  NULL  1.25  .625 

Dies ist wahrscheinlich nicht möglich ist, aber ich hatte zu fragen, ob jemand mit einer Lösung helfen könnte.

Antwort

0

Sie könnten REPLICATE verwenden, um eine zwei- oder mehrstellige Nummer zu generieren, die einfach bestellt werden kann.

create table test(rn varchar(10)); 

insert into test 
values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('10'), ('11'), ('12'); 

select num 
from 
    (select 'Component_' + replicate('0', 2 - len(rn)) + rn as num 
     from test) x 
order by num; 

Ergebnis:

| num   | 
| :----------- | 
| Component_01 | 
| Component_02 | 
| Component_03 | 
| Component_04 | 
| Component_05 | 
| Component_06 | 
| Component_07 | 
| Component_08 | 
| Component_09 | 
| Component_10 | 
| Component_11 | 
| Component_12 | 

dbfiddle here

+0

@marc_s dieses Format erzeugt wird, automatisch von dbfiddle – McNets