2016-10-30 1 views
2

Ich habe ein Problem bei der Aufteilung von dynamischen Spaltenwerten in dynamische Mehrfachspalten.So teilen Sie dynamische Spaltenwerte in dynamische multiple Spaltenwerte

Ich habe Tabelle wie folgt aus:

media campaign number --- Dynamic varchar 
----------------------------------------------------- 
1 --- d1:11d2:5d3:11d4:0 
2 --- d1:2d2:2d3:3d4:2d5:0 
3 --- d1:0d2:0d3:1d4:4d5:0d6:2d7:1 

ich die Zelle in dynamische Anzahl der Spalten trennen wollen, nach Zeiten der „dNumber“ erscheinen.

wird das Ergebnis sein:

media campaign number -- d1 - d2 - d3 - d4 - d5 - d6 - d7 
1 - 11 - 5 - 11 - 0 
2 - 2 - 2 - 3 - 2 - 0 
3 - 0 - 0 - 1 - 4 - 0 - 2 - 1 

Jede Idee, wie es zu lösen?

+1

Vermutlich Sie eine maximale Anzahl von Spalten haben Sie wollen wie beispielsweise 7. –

+0

NR. es könnte mehr als 7 sein – MiaWal

Antwort

1

Ich vermute, Sie müssen möglicherweise dynamisch gehen, es sei denn, Sie können eine maximale Anzahl von Spalten definieren.

Im Folgenden verwendet eine Parse/Solit Funktion

Declare @YourTable table (ID int, [campaign number] varchar(max)) 
Insert Into @YourTable values 
(1,'d1:11d2:5d3:11d4:0'), 
(2,'d1:2d2:2d3:3d4:2d5:0'), 
(3,'d1:0d2:0d3:1d4:4d5:0d6:2d7:1') 

Select A.ID 
     ,ColSeq = cast(B.RetSeq-1 as varchar(25)) 
     ,ColValue = IIF(CharIndex('d',RetVal)=0,RetVal,Left(RetVal,CharIndex('d',RetVal)-1)) 
Into #Temp 
From @YourTable A 
Cross Apply (Select * from [dbo].[udf-Str-Parse](A.[campaign number],':') Where RetSeq>1) B 

Declare @SQL varchar(max) = '' 
Select @[email protected]+',D'+ColSeq+'=max(case when ColSeq='+ColSeq+' then ColValue else null end)' 
    From (Select Top 100 Percent ColSeq from #Temp Group By ColSeq Order By cast(ColSeq as int)) A 

Select @SQL = 'Select ID'[email protected]+' From #Temp Group By ID Order By ID' 
Exec(@SQL) 

Returns

enter image description here

Die Parse-Funktion benötigt, wenn

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>'+ Replace(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
+0

Vielen Dank. es ist Arbeit. Haben Sie Unterlagen zu Ihrer Lösung? – MiaWal

+0

@MiaWal Run Wählen Sie * aus [dbo]. [Udf-Str-Parse] ('d1: 11d2: 5d3: 11d4: 0', ':') nur um zu visualisieren, was der Parser tut. Die Abfrage wendet die Analyse für jeden Datensatz an. Dieser normalisierte Datensatz wird in #Temp abgelegt, und dann werden die zu drehenden Spalten dynamisch erstellt. –