2016-07-29 18 views
0

Ich möchte ein Select transponieren, sondern kann meinen Kopf nicht um Pivot bekommen, und ich bin noch perplex durch folgende an zahlreichen Tutorials gefunden:SQL Server Transponieren

„Hätten die Quelldaten dort richtig normalisiert wäre gewesen Sie müssen die Spalten und Zeilen nicht umwandeln. Wenn Sie diese Art der Umwandlung regelmäßig durchführen müssen, haben Sie ein Problem mit Ihrem Schemadesign. "

Insbesondere wie würde Normalisierung ein Select ermöglichen für die transponierten Werte zurück:

SELECT 
    Date, Activity 
FROM 
    EVENTS 
WHERE 
    CITY = 'Seattle' 

(dh anstatt Veranstaltungstermine column1 going down ich die Daten möchten als Spalten gehen across)

+0

Wie viele Daten gibt es, und könnte die Anzahl variieren? Die Antwort darauf wird bestimmen, ob Sie dynamisches SQL benötigen, um Ihr Problem zu lösen. –

+0

Ich gehe davon aus, dass sich die zitierte Aussage eher auf das Pivotieren als auf das Pivotieren bezieht. z.B. Anstatt eine Spalte für die Stadt zu haben, haben Sie Spalten "Seattle", "SomeOtherCity", "SomeOtherOtherCity" oder so ähnlich. Normalisieren Sie Ihre Daten macht es einfacher, PIVOT zu verwenden, weil Sie es nicht normalisieren müssen (UNPIVOT) dann PIVOT, denke ich. Es würde nicht direkt ein PIVOT ohne eine PIVOT-Anweisung aktivieren. – ZLK

Antwort

0

Vielleicht können Sie eine Methode ähnlich der folgenden Beispiel wählen, Ich verwendete dynamic SQL mit CTE-Anweisung und CASE-Operator. habe ich nur den CTE Ausdruck Datumzeit auf aktuelle Daten für die Umwandlung von Typ nicht convertion in jeder CASE-Anweisung

declare @mm varchar(2) = datepart(mm,getdate()) 
declare @sql nvarchar(max) 
set @sql = N' 
;with cte as (
    SELECT 
     DATEPART(dd,[date]) dd, 
     convert(date,[date]) [date], 
     Activity 
    FROM 
     [events] 
) 
SELECT 
    case when dd = 1 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 2 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 3 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 17 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 18 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 19 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 20 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 28 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 29 then Activity end as ''' + '01/'[email protected]+'/2016' + ''', 
    case when dd = 30 then Activity end as ''' + '01/'[email protected]+'/2016' + ''' 
FROM cte' 
print @sql 
exec sp_executeSQL @sql 

Natürlich wiederholen ein dynamic pivot query wird Ihre Anforderung besser passen. Sie können mit statischen Pivot-Beispielen beginnen, um die Struktur zu verstehen, und dann an Ihrem Beispielfall arbeiten. Im letzten Schritt können Sie Ihren Code in dynamische Pivot-Abfrage konvertieren