2017-05-17 4 views
3

SQL Serverを使用していますが、この問題への対処方法がわかりません。SQL異なる値を持つ1つの列を複数の列に変換する

Device  Time    ValueID Value Voltage 
------------------------------------------------------------ 
1 2014-03-08 22:50:00  AH1  90,0 90,000" 

1 2014-03-08 22:50:00  AT1  5,5  5,500" 

1 2014-03-08 22:50:00  PP1  0,0  0,000" 

1 2014-03-08 22:50:00  WS1  0,0  0,000" 

1 2014-03-08 22:50:00  WD1  270,0 270,000" 

1 2014-03-08 22:50:00  SR1  0,0  0,000" 

1 2014-03-08 23:49:00  ST1  8,288 2,993" 

カラムValueID 13は異なるデータ型を有し、列の値がデータ・タイプの測定が含ま: 私は、次の形式のレコードの5.5Mとつのテーブルを持っています。

私は次の形式を持つテーブルを作成する必要が

Device Time ValueID(AH1) ValueID(AT1) ValueID(PP1) etc... 
------------------------------------------------------------ 
    1 xxxx Value   Value   Value 

任意の異なるaproach¿、私はcase文で新しいテーブルでINSERTを使用しようとしていたが、それは動作しませんか?どんな手掛かり? おかげ

+1

msysqlまたは(MS)SQL Server?無関係のタグを削除してください – Jens

答えて

2

IF OBJECT_ID('Tempdb..#temp') IS NOT NULL 
Drop Table #temp 

;WITH cte(Device,Time,ValueID,Value,Voltage) 
AS 
(
SELECT 1,'2014-03-08 22:50:00' ,'AH1', '90,0' , '90,000' Union all 
SELECT 1,'2014-03-08 22:50:00' ,'AT1', '5,5' , '5,500' Union all 
SELECT 1,'2014-03-08 22:50:00' ,'PP1', '0,0' , '0,000' Union all 
SELECT 1,'2014-03-08 22:50:00' ,'WS1', '0,0' , '0,000' Union all 
SELECT 1,'2014-03-08 22:50:00' ,'WD1', '270,0', '270,000' Union all 
SELECT 1,'2014-03-08 22:50:00' ,'SR1', '0,0' , '0,000' Union all 
SELECT 1,'2014-03-08 23:49:00' ,'ST1', '8,288', '2,993' 
) 
SELECT * INTO #TEMP FROM CTE 

Declare @Col nvarchar(max), 
     @Sql nvarchar(max), 
     @dynamicCol nvarchar(max) 

SELECT @Col=STUFF((SELECT ', '+ ValueID 
From #temp For XML PATH ('')),1,1,'') 

;With cte 
AS 
(
SELECT STUFF((SELECT DISTINCT ', '+ ValueID + ' AS '+QUOTENAME(' ValueID ('+ValueID+')') 
From #temp For XML PATH ('')),1,1,'') AS DynamicColumnames 
) 
SELECT @dynamicCol= DynamicColumnames from cte 

SET @Sql=' 
SELECT Device,Time,'+ @dynamicCol +' From 
(
SELECT Device,Time,ValueID,Value From 
#temp 
)AS Src 
PIVOT 
(
MAX(Value) For ValueID IN ('[email protected]+') 
) 
AS Pvt' 

Print @Sql 

EXEC(@Sql) 
+0

うーん、それは動作しますが...どのようにすべてのテーブルを選択できますか?この例では最初の行のみを選択していますので、5.5Mのレコードを持っています。 – WinterZ

+0

あなたの希望する結果に応じてクエリを書いたので、あなたのテーブル構造はどうなるでしょうか? –

+0

[img] http://i.imgur.com/AC54h3q png [/ img] – WinterZ

3

あなたは以下のようにピボットを使用することができます:あなたは以下のように動的な列を生成することができます

select Device, [Time], [AH1] as [Value(AH1)], [AT1] as [Value(AT1)]... from (
    select Device, [Time], ValueId, [Value] from Yourtable) 
pivot (max([value]) for valueId in ([AH1],[AT1]...)) p 

:我々は、動的なピボットを使用して、結果をacheiveすることができます

declare @cols varchar(max) 
declare @fromcols varchar(max) 
declare @query varchar(max) 

select @cols = stuff((select ','+QuoteName(valueid) from #yourdevice group by valueid for xml path('')),1,1,'') 
select @fromcols = stuff((select ','+QuoteName(valueid)+' as [Value('+ Valueid + ')]' from #yourdevice group by valueid for xml path('')),1,1,'') 
--[AH1] as [Value(AH1)], [AT1] as [Value(AT1)]... 

SET @query = 'select Device, [Time], ' + @fromcols + ' from (' + ' select Device, [Time], ValueId, [Value] from Yourtable) a ' 
SET @Query = @query + ' pivot (max([value]) for valueId in (' + @cols + ')) p ' 

select @query --Execute below by uncommenting after checking the query 
--exec sp_execute @query 
関連する問題