2016-07-05 8 views
0

Ich habe die folgenden Tabellendatum:Wie erstellt man Spalten aus Zeilen in SQL Server mit dynamischem SQL oder Pivot?

name | serviceName | contractNo | materialNo 
-------------------------------------------- 
item1 managed foo 123456  A6Ax33444 
item1 managed bar 534454  A6A3222x7 

Und das ist das Ergebnis, das ich brauche:

name | serviceName1 | contractNo1 | materialNo1 | serviceName2 | contractNo2 | materialNo2 
item1 managed foo 123456  A6Ax33444  managed bar 534454  A6A3222x7 

Dieses Beispiel enthält nur zwei Service-Namen, aber es kann null bis etwa 10 verschiedene Dienstleistungen.

Ich habe versucht, mehrere Dinge mit Pivoting und dynamische SQL-Abfragen wie diese SQL Server: Examples of PIVOTing String data oder Combine multiple rows into multiple columns dynamically in SQL Server, aber es kann nicht funktionieren.

Die realen Daten werden mit mehreren Joins abgefragt, 'name' kommt aus einer Tabelle, 'serviceName', 'contractNo' und 'materialNo' werden aus einem anderen zusammengefügt und es gibt viel mehr Spalten, aber der Inhalt ist das Gleiche.

Vielen Dank für Ihre Hilfe!

+0

Es sollte kein Problem sein, in es über dynamische SQL zu tun: Erstens eine Variable deklarieren, die die Gesamtzahl eines Grafen (distinct) und thenrepeat von 0 bis Var nimmt und einen String concat ... aber die Frage ist: Wie wollen Sie später mit der Tabelle umgehen? Wie Sie bereits erwähnt haben, ist es möglich, 0 bis 10 Spalten zu haben ... vielleicht erstellen Sie jetzt eine Tabelle mit maximal 10 Spalten ... morgen erhalten Sie eine 11. Zeile - und jetzt? Und außerdem: Auch wenn Sie es nicht in einer Tabelle speichern, sondern nur in einer Art von Reporting anzeigen: Wie groß ist die Zeile? Warum es nicht in irgendeiner Form von Tabelle/Baum anzeigen – Tyron78

+0

@Rene: Danke für Ihren Kommentar. Das ganze Zeug wird in einer gespeicherten Prozedur verwendet, die von EF6 aufgerufen und dann in einem ASPxGrid (devexpress) angezeigt wird. – Jan

Antwort

0

Hier gebe ich die Lösung nur für zwei Reihen. Versuche dies.

Wenn es für Sie funktioniert, müssen Sie für mehr versuchen.

select d.name 
    ,max(case when Rn = 1 then cast(ServiceName as NVARCHAR) end) ServiceName1 
    ,max(case when Rn = 1 then cast(ContractNo as NVARCHAR) end) ContractNo1 
    ,max(case when Rn = 1 then cast(MeterialNo as NVARCHAR) end) MeterialNo1 
    ,max(case when Rn = 2 then cast(ServiceName as NVARCHAR) end) ServiceName2 
    ,max(case when Rn = 2 then cast(ContractNo as NVARCHAR) end) ContractNo2 
    ,max(case when Rn = 2 then cast(MeterialNo as NVARCHAR) end) MeterialNo2 
from (
select * 
,ROW_NUMBER() over(PARTITION BY name ORDER BY(select null)) Rn 
from your_Table 
)d 
group by d.name