2017-03-21 6 views
1

ich in der folgenden Tabelle sind wie folgt:Konvertieren von Spalten in Zeilen Mit Pivot In SQL Server

Ich möchte es konvertieren, wie folgt:

+------------+---------------------+---------------------+ 
| Child_Code |  SewingStart  |  SewingEnd  | 
+------------+---------------------+---------------------+ 
|  000001 | 2017-02-21 00:00:00 | 2017-03-21 00:00:00 | 
+------------+---------------------+---------------------+ 

Jede Hilfe Bitte !!

+3

Poss ible Duplikat von [Konvertieren von Zeilen in Spalten mit 'Pivot' in SQL Server] (http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server) –

+0

Fügen Sie einige hinzu mehr Beispieldaten, um die Dinge schwieriger und beschreibender zu machen. (Wenn es immer zwei Daten pro Code gibt, kannst du eine Gruppe durchmachen.) – jarlh

Antwort

2

Wenn Sie eine begrenzte Anzahl von Zeilen haben, können Sie bedingte Aggregation oder Pivot verwenden. Aber Sie brauchen eine Spalte dafür. Also:

Sie können diese Methode nur verwenden, wenn Sie die maximale Anzahl von Plandaten kennen, die Sie möchten. Andernfalls müssen Sie einen dynamischen Drehpunkt verwenden. Die Idee ist die gleiche, aber die Abfragezeichenfolge muss erstellt werden und sollte dann an sp_executesql übergeben werden.

EDIT:

Wenn Sie nur zwei Werte haben, dann ist group by wahrscheinlich einfacher. Im Folgenden behandelt den Fall, in dem es nur einen Wert:

select child_code, min(plan_date) as plan_date_1, 
     (case when min(plan_date) <> max(plan_date) then max(plan_date) 
     end) as plan_date_2 
from t 
group by child_code; 
+0

Wow !! Es klappt!! Kein Problem! plan_date ist auf zwei beschränkt !! Lieber Gordon Linoff, ich brauche noch Hilfe von dir !! Warte, ich werde dich hier erwähnen ... Hoffe du wirst mir helfen – TanvirArjel

1

Sie müssen dynamische SQL verwenden, wenn die maximale Anzahl von plan_date unbekannt ist. Sie müssen row_number() verwenden, um jede durch Child_Code partitionierte Liste für die Verwendung mit pivot() zu nummerieren.

Testaufbau:

create table t (child_code varchar(6), plan_date datetime); 
insert into t values ('000001','20170221'),('000001','20170321'); 
declare @cols nvarchar(max); 
declare @sql nvarchar(max); 

    select @cols = stuff((
    select distinct 
     ',' + quotename('Plan_Date_' 
      +convert(nvarchar(10),row_number() over (
       partition by Child_Code 
       order by  Plan_Date 
     )) 
     ) 
     from t 
     for xml path (''), type).value('.','nvarchar(max)') 
    ,1,1,''); 

select @sql = ' 
select Child_Code, ' + @cols + ' 
from (
    select 
     Child_Code 
    , Plan_Date 
    , rn=''Plan_Date_''+convert(nvarchar(10),row_number() over (
      partition by Child_Code 
      order by  Plan_Date 
     )) 
    from t 
    ) as a 
pivot (max([Plan_Date]) for [rn] in (' + @cols + ')) p'; 
select @sql as CodeGenerated; 
exec sp_executesql @sql; 

rextester Demo: http://rextester.com/YQCR87525

Code generiert:

select Child_Code, [Plan_Date_1],[Plan_Date_2] 
from (
    select 
     Child_Code 
    , Plan_Date 
    , rn='Plan_Date_'+convert(nvarchar(10),row_number() over (
      partition by Child_Code 
      order by  Plan_Date 
     )) 
    from t 
    ) as a 
pivot (max([Plan_Date]) for [rn] in ([Plan_Date_1],[Plan_Date_2])) p 

kehrt

+------------+---------------------+---------------------+ 
| Child_Code |  Plan_Date_1  |  Plan_Date_2  | 
+------------+---------------------+---------------------+ 
|  000001 | 21.02.2017 00:00:00 | 21.03.2017 00:00:00 | 
+------------+---------------------+---------------------+ 
+0

Danke für deine Antwort !! Es funktioniert auch für mich !! – TanvirArjel

+0

@TanvirArjel Glücklich zu helfen! – SqlZim

+0

Bitte sehen Sie sich meine Frage erneut an. Ich habe sie etwas erweitert, da ich Plan_Date_1 durch SewingStart und Plan_Date_2 durch SewingEnd ersetzt habe !! – TanvirArjel

Verwandte Themen