2016-09-29 7 views
1

私が持っている3列このようなname, value, tsを持つテーブル:SQL Serverは:7つのcolumsテーブルに3列のテーブルをソート

と私は7列I1, I2, I3, P, COS, Wh, TSが好きで、テーブルにそれを変換したいです:表1で

データは、すべてのタイムスタンプで、6件のデータが記録されます、生データです。これらの6つのデータ(I1、I2、I3、P、COS、WH)は、「NAME」という列の下に記録されます。私が達成したいのは、これらの6つのデータを6つの異なる列にソートし、それを「I1、I2、I3、P、COS、WH」という名前にすることです。

+1

詳細を正確に説明してください。私は新しいテーブルテーブルを作成する必要がありますまたは私はどこから治療の後にテーブルの値を取得する必要があります。 – Iqbal

+0

[ピボット](https://technet.microsoft.com/nl-nl/library/ms177410%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396)をご覧ください – NickyvV

+0

また、ソースとターゲットテーブルが既に配置されている状態で、SQLFiddleを使用します。そうすれば、私たちにとってより簡単になり、時間を節約することができます。 – Marco

答えて

2

使用PIVOTPARSENAME

DECLARE @tblTest AS Table(
    Name VARCHAR(50), 
    Value DECIMAL(15,2), 
    TS Datetime 
) 

INSERT INTO @tblTest VALUES 
('BLOCKE.SB_1_A.I1',22.44912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.I2',17.5628912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.I3',9.6644912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.P',10102.935912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.COS',-0.83344912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.Wh',70011032,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.I1',22.44912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.I2',17.5628912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.I3',9.6644912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.P',10102.935912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.COS',-0.83344912566,'2016-02-07 18:50:00') 
,('BLOCKE.SB_1_A.Wh',70011032,'2016-02-07 18:50:00') 

;WITH T AS 
(
    SELECT 
     PARSENAME(Name,1) AS Name, 
     ROUND(Value,2,2) AS Value, 
     TS, 
     ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Name) AS RowNo 
    FROM @tblTest T 
) 

SELECT [I1],[I2],[I3],[P],[COS],[Wh],TS from 
(
    SELECT * 
    FROM T 
) x 
pivot 
(
    MAX(Value) 
    FOR Name in ([I1],[I2],[I3],[P],[COS],[Wh]) 
) p 

出力:

enter image description here 注:日convertionロジックがこんにちは

+0

コードでは、私に3行のデータを与える代わりに、テーブルに「Null」がたくさんある8行のデータが得られます。 –

+0

私はあなたが何かを見逃していると思う、私は答えをテストしたコード –

+0

私はすべての文で更新を持っている –

0

私の答えが最高のものかどうかは分かりませんが、これは私の心に来ました。 次の手順を作成します。

1名前列のSELECT DISTINCT。

2各DISTINCTエントリに対して、データを選択してテンポラリテーブルにデータを保存します。

3一時テーブルのデータを1つのテーブルに順番に挿入します。

4-同じ行番号の各データは、新しいテーブルの同じ行にあります。

私はSQLプロシージャASAPを書く時間を見つけようとします。

+0

'EXTINCT'は' DISTINCT'にする必要がありますか? –

+0

現在、私の手順は: –

+0

1.すべてのデータを5つの異なるテーブルに保存する2.すべてのテーブルを結合する(しかし、何らかのエラーがあり、データが記録されていないために行が一致しない) –

0

が含まれていません。これは、

罰金を動作するはずです
-- ---create table and insert data. i believe you have got the table already 
CREATE TABLE #Sort (Name Varchar(30), [Value] Float, TS Datetime) 

INSERT INTO #Sort 
VALUES 
('BLOCKE.SB_1_A.I1',22.4491,'2016-02-07 18:50'), 
('BLOCKE.SB_1_A.12',17.5628,'2016-02-07 18:50'), 
('BLOCKE.SB_1_A.13',9.6657,'2016-02-07 18:50'), 
('BLOCKE.SB_1_A.P',10102.93945,'2016-02-07 18:50'), 
('BLOCKE.SB_1_A.COS',-0.833737,'2016-02-07 18:50'), 
('BLOCKE.SB_1_A.WH',70011032,'2016-02-07 18:50'), 
('BLOCKE.SB_1_A.I1',22.56704,'2016-02-07 19:00'), 
('BLOCKE.SB_1_A.I2',17.48134,'2016-02-07 19:00'), 
('BLOCKE.SB_1_A.I3',9.73746,'2016-02-07 19:00'), 
('BLOCKE.SB_1_A.P',10067.5742,'2016-02-07 19:00'), 
('BLOCKE.SB_1_A.COS',-0.8270988,'2016-02-07 19:00'), 
('BLOCKE.SB_1_A.WH',70012768,'2016-02-07 19:00'), 
('BLOCKE.SB_1_A.I1',22.60925,'2016-02-07 19:10'), 
('BLOCKE.SB_1_A.I2',17.54026,'2016-02-07 19:10'), 
('BLOCKE.SB_1_A.I3',9.81285,'2016-02-07 19:10'), 
('BLOCKE.SB_1_A.P',10078.8154,'2016-02-07 19:10'), 
('BLOCKE.SB_1_A.COS',-0.8246349,'2016-02-07 19:10'), 
('BLOCKE.SB_1_A.WH',70014472,'2016-02-07 19:10') 

----use a vte to to select the data 
;WITH Sordata 
AS 
(SELECT 
CASE WHEN RIGHT(Name,2) = 'I1' THEN 'I1' 
    WHEN RIGHT(Name,2) = 'I2' THEN 'I2' 
    WHEN RIGHT(Name,2) = 'I3' THEN 'I3' 
    WHEN RIGHT(Name,1) = 'P' THEN 'P' 
    WHEN RIGHT(Name,3) = 'COS' THEN 'COS' 
    WHEN RIGHT(Name,2) = 'WH' THEN 'HW' 
    END AS Names, 
--Name, 
Value, 
CONVERT(VARCHAR(10), TS, 101) + ' '+ LTRIM(RIGHT(CONVERT(CHAR(20), TS, 22), 11)) AS TS 
FROM #Sort 
) 
SELECT 
* 
FROM Sordata 
PIVOT 
(
MAX(Value) FOR Names IN ([I1],[I2],[I3],[P],[COS],[HW]) 
) AS PV1 
+0

'SUM(値)'はデータを変更し(データは10進数が多い)、 'MAX(値)'に変更して元のデータを返します。あなたの投稿に感謝します。 –

+0

PV1テーブルをSQLの新しいテーブルとして保存する方法は? –

関連する問題