2017-10-30 3 views
1

私が持っているテーブルtblTags(日付、Tagindex、値)SQL Serverで列の値を列として設定する方法はありますか?

表中の値は次のとおりです。私が書いたこのため

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

:として

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 

は、私は結果が欲しいです追い付くクエリ

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

しかし、私はこれらのエラーが発生しますS:int型へのデータ型はnvarcharを変換

メッセージ8114、レベル16、状態1、行10
エラー。

メッセージレベル473、レベル16、状態1、行10
不適切な値 "tblTag"がPIVOT演算子で指定されています。

この問題を解決する方法。

答えて

1

私はこのようなクエリを使用することができると思う:

;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

注:上記のクエリでは、私は各DateTagindexのためのシーケンス番号を作成するためにrow_number()機能を使用して、しかし、トリックは、部分的に使用する一時的なフィールドである(select 0)を使用しています。これは、挿入された行の任意の順序を返すことはできません。したがって、信頼できる結果セットを取得する必要がある場合。 datetimeや自動インクリメントフィールドのような余分なフィールドが必要です。

1

はこれを試してみてください:

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; 

あなたは正確にwhich are the PIVOT columnsを言う必要があります。 TagIndexに異なる値を設定し、それらをハードコーディングできない場合は、動的PIVOTを使用する必要があります。

また、tagIndexの値を1つの行にグループ化する方法があることを確認する必要があります。たとえば、私のテストデータと異なる日付、行が挿入されたときにマークするIDカラム(グループIDカラムまたは日付追加カラム)。

関連する問題