2017-05-26 16 views
1

Wie kann ich eine SQL Server-Datenzeile in mehrere Spalten transponieren? Ich habe Daten so etwas wie unten gezeigtWie kann ich SQL Server-Zeilen in mehrere Spalten transponieren?

 [STOCK NO]  [PN1]   [PN2]    [PN3]   [PN4]       [PN4]   [PN5]   [PN6]  [PN7]  [PN8]     [PN9] [PN10] [PN11] [PN12] [Qty] 
    700349L   600446   201743   100208          300219   400533     100280  100218     100222   100220 100221  1 

Ich möchte so etwas wie dieses

[STOCK NO]  [bomRev]  [bomEntry] [partId] [qty] [cmnt] [srcLoc] [dType] [lead] [lineNbr] 
700349L    A    1   600446 1  `TEST` TEST  0   0  1 
700349L    A    2   201743 1  `TEST` TEST  0   0  2 
700349L    A    3   100208 1  `TEST` TEST  0   0  3 
700349L    A    4   300219 1  `TEST` TEST  0   0  4 

700349L    A    5   400533 1  `TEST` TEST  0   0  5 

700349L    A    6   100218 1  `TEST` TEST  0   0  6 
700349L    A    7   100222 1  `TEST` TEST  0   0  7 
700349L    A    8   100220 1  `TEST` TEST  0   0  8 
700349L    A    9   100221 1  `TEST` TEST  0   0  9 

sehen Dann habe ich Insert aus select-Anweisung verwenden möchten, wie unten gezeigt, aber ich mag die Zeile mehrere transponieren Spalten

INSERT INTO [DT]([bomItem], [bomRev], [bomEntry], [partId], [qty], [cmnt],[srcLoc], [dType], [lead], [lineNbr]) 
    SELECT 
     [STOCK NO], 'A', [bomEntry], [partid], [qty], 'TEST', 'TEST', '0', '0', [lineNbr] 
    FROM 
     [ST] 

skip if blank

+0

Mögliches Duplikat [Transponieren/Pivot Zeilen zu Spalten und Summe] (https://stackoverflow.com/questions/18322488/transpose-pivot-rows-to-columns-and-sum) und [SQL Total - Pivot Spalte] (https://stackoverflow.com/q/25293671/62576) –

Antwort

0

Dies verwendet die Spalten und Beispieldaten vor weiteren Änderungen in der Frage.

cross apply() mit Ihren Spalten und row_number() Anzahl an UNPIVOT nur die Zeilen, die einen Wert haben:

--INSERT INTO [DT]([bomItem], [bomRev], [bomEntry], [partId], [qty], [cmnt],[srcLoc], [dType], [lead], [lineNbr]) 
select 
    st.[CALC STOCK NO]  
    , bomRev = 'A' 
    , bomEntry = row_number() over (order by u.ordinal) 
    , u.Partid 
    , st.Qty 
    , cmnt = 'Test' 
    , srcLoc = 'Test' 
    , dType = '0' 
    , lead = '0' 
    , lineNbr = row_number() over (order by u.ordinal) 
from st 
    cross apply (values 
    (1,[BOM WHEEL PN]) 
    ,(2,[BOM TIRE PN]) 
    ,(3,[BOM VALVE PN]) 
    ,(4,[BOM - SECONDARY DISC PN]) 
    ,(5,[BOM - DISC]) 
    ,(6,[BOM - RIM]) 
    ,(7,[BUY WHEEL]) 
    ,(8,[COLOR PN]) 
    ,(9,[WHL BOM PART 1 PN]) 
    ,(10,[WHL BOM PART 2 PN]) 
    ,(11,[WHL BOM PART 3 PN]) 
    ,(12,[WHL BOM PART 4 PN]) 
    ,(13,[WHL BOM PART 5 PN]) 
) u (ordinal, partId) 
where nullif(u.partId,'') is not null 

rextester Demo: http://rextester.com/XNGB57562

kehrt:

+---------------+--------+----------+--------+-----+------+--------+-------+------+---------+ 
| CALC STOCK NO | bomRev | bomEntry | Partid | Qty | cmnt | srcLoc | dType | lead | lineNbr | 
+---------------+--------+----------+--------+-----+------+--------+-------+------+---------+ 
| 700349L  | A  |  1 | 600446 | 1 | Test | Test |  0 | 0 |  1 | 
| 700349L  | A  |  2 | 201743 | 1 | Test | Test |  0 | 0 |  2 | 
| 700349L  | A  |  3 | 100208 | 1 | Test | Test |  0 | 0 |  3 | 
| 700349L  | A  |  4 | 300219 | 1 | Test | Test |  0 | 0 |  4 | 
| 700349L  | A  |  5 | 400533 | 1 | Test | Test |  0 | 0 |  5 | 
| 700349L  | A  |  6 | 100280 | 1 | Test | Test |  0 | 0 |  6 | 
| 700349L  | A  |  7 | 100218 | 1 | Test | Test |  0 | 0 |  7 | 
| 700349L  | A  |  8 | 100222 | 1 | Test | Test |  0 | 0 |  8 | 
| 700349L  | A  |  9 | 100220 | 1 | Test | Test |  0 | 0 |  9 | 
| 700349L  | A  |  10 | 100221 | 1 | Test | Test |  0 | 0 |  10 | 
+---------------+--------+----------+--------+-----+------+--------+-------+------+---------+ 
+0

Vielen Dank !! zwei Dinge 1. Kann ich die eingefügte Tabelle verwenden, um Trigger zu erstellen? 2. wie kann ich ignorieren/überspringe, wenn blank Teil i Bild hinzugefügt, um zu zeigen – user8066749

+0

@ user8066749 Meine Antwort aktualisiert, um die leeren Zeichenfolgen aus den Ergebnissen mit 'nullif (u.partId, '') ist nicht null 'statt nur' u. partid ist nicht null'. Ich habe auch eine auskommentierte Anweisung 'insert' vor der Abfrage eingefügt, die Sie zum Einfügen in die Tabelle, die Sie beschreiben, verwenden können. – SqlZim

+0

Vielen Dank !!! Ich kann anstelle von "st" einfügen, um Trigger zu erstellen? – user8066749

Verwandte Themen