2017-10-30 2 views
1

Ich habe eine Tabelle tblTags (Datum, Tagindex, Value)Wie legen Sie Zeilenwert als Spalte in SQL Server fest?

Die Werte in der Tabelle sind:

Date   Tagindex Value 
--------------------------------- 
2017-10-21   0   21 
2017-10-21   1   212 
2017-10-21   2   23 
2017-10-21   0   34 
2017-10-21   1   52 
2017-10-21   2   65 

möchte ich das Ergebnis als:

Date   0 1  2 
------------------------------- 
2017-10-21  21 212 23 
2017-10-21  34 52 65 

Dafür ich das schrieb following query

select * 
from 
    (SELECT a.Date, a.Tagindex,a.value 
    FROM tblTag a) as p 
pivot 
    (max(value) 
     for Tagindex in ([tblTag]) 
    ) as pvt 

Aber ich bekomme diese Fehler s:

Msg 8114, Ebene 16, Status 1, 10 Zeile
Fehler beim Konvertieren Datentyp nvarchar in int.

Msg 473, Ebene 16, Status 1, Zeile 10
Der falsche Wert "tblTag" wird im PIVOT-Operator bereitgestellt.

So lösen Sie dieses Problem.

Antwort

1

Ich denke, eine Abfrage wie folgt verwendet werden:

;with t as (
    select * 
    , row_number() over (partition by [Date],[Tagindex] order by (select 0)) seq 
    from tblTag 
) 
select [Date], 
    max(case when [Tagindex] = 0 then [Value] end) '0', 
    max(case when [Tagindex] = 1 then [Value] end) '1', 
    max(case when [Tagindex] = 2 then [Value] end) '2' 
from t 
group by [Date], seq; 

SQL Server Fiddle Demo
SQL Server Fiddle Demo - with pivot

Hinweis: In obiger Abfrage I row_number() Funktion verwenden, um eine Sequenznummer für jeden Date und Tagindex zu schaffen, sondern die Trick ist in (select 0) zu verwenden, das ein temporäres Feld ist, um in der Reihenfolge nach dem Teil zu verwenden, das nicht vertrauenswürdig ist, willkürliche Reihenfolge der eingefügten Zeilen zurückzugeben. So, wenn Sie eine vertrauenswürdige Ergebnismenge erzielen müssen; Sie müssen ein zusätzliches Feld wie ein datetime oder ein Auto-Inkrement-Feld haben.

1

Try this:

DECLARE @tblTag TABLE 
(
    [Date] DATE 
    ,[TagIndex] TINYINT 
    ,[Value] INT 
); 

INSERT INTO @tblTag ([Date], [TagIndex], [Value]) 
VALUES ('2017-10-21', 0, 21) 
     ,('2017-10-21', 1, 212) 
     ,('2017-10-21', 2, 23) 
     ,('2017-10-22', 0, 34) 
     ,('2017-10-22', 1, 52) 
     ,('2017-10-22', 2, 65); 

SELECT * 
FROM @tblTag 
PIVOT 
(
    MAX([value]) FOR [Tagindex] IN ([0], [1], [2]) 
) PVT; 

Sie müssen genau sagen which are the PIVOT columns. Wenn Sie unterschiedliche Werte für die TagIndex haben und diese nicht fest codieren können, müssen Sie dynamisches PIVOT verwenden.

Außerdem müssen Sie sicher sein, dass Sie die Werte in einer Zeile gruppieren können. Zum Beispiel ein anderes Datum (wie in meinen Testdaten), ID Spalte, die markiert, wenn eine Zeile eingefügt wird oder etwas anderes (Spalte für Gruppen-ID oder Datum hinzugefügt).

Verwandte Themen