2017-08-14 11 views
0

私は以下のようなデザインのテーブルを持っています。値のNULLではなくSQL 2012の動的ピボット

私は次のように私のテーブル内のデータを持っている
HIST_TIMESTAMP datetime Unchecked 
HIST_TIMESTAMP_DST char(1) Unchecked 
TABLE_INDEX int Unchecked 
HIS_CHANGED varchar(1) Checked 
QUALITY tinyint Checked 
VALUE real Checked 

:表のインデックスとデータがすべてのテーブルインデックス

ごとに分を記憶している3744の

HIST_TIMESTAMP HIST_TIMESTAMP_DST TABLE_INDEX HIS_CHANGED QUALITY VALUE 
2017-08-14 12:18:01.000 s 1 NULL 1 -3.927756 
2017-08-14 12:19:01.000 s 1 NULL 1 -3.927756 
2017-08-14 12:18:01.000 s 2 NULL 1 5.109651 
2017-08-14 12:19:01.000 s 2 NULL 1 5.109651 
2017-08-14 12:18:01.000 s 3 NULL 0 NULL 
2017-08-14 12:19:01.000 s 3 NULL 0 NULL 
2017-08-14 12:18:01.000 s 4 NULL 1 50 
2017-08-14 12:19:01.000 s 4 NULL 1 50 
2017-08-14 12:18:01.000 s 5 NULL 1 36.59948 
2017-08-14 12:19:01.000 s 5 NULL 1 36.59948 
2017-08-14 12:18:01.000 s 6 NULL 1 -122.7314 

合計を今、私は私を変換するためのピボットをしたいです次のように列としてタイムスタンプが、Iは、ピボットTSQL コードを使用してみました:

use eta_user 
DECLARE @cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.HIST_TIMESTAMP) 
     FROM eta_user.ANALOG_HISTORY c 
     FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

set @query = 'SELECT TABLE_INDEX, ' + @cols + ' from 
     (
      select table_index 
       , value 
       , hist_timestamp 
      from eta_user.analog_history 
     ) x 
     pivot 
     (
      max(value) 
      for HIST_TIMESTAMP in (' + @cols + ') 
     ) p ' 

execute(@query)

しかし、出力にはnullがありますが、なぜそれはわかりません。出力の画面は次のとおりです。

1 NULL NULL 
2 NULL NULL 
3 NULL NULL 
4 NULL NULL 
5 NULL NULL 
6 NULL NULL 
7 NULL NULL 
8 NULL NULL 
9 NULL NULL 
10 NULL NULL 
11 NULL NULL 
12 NULL NULL 
13 NULL NULL 
14 NULL NULL 
15 NULL NULL 
16 NULL NULL 
17 NULL NULL 
18 NULL NULL 
19 NULL NULL 
20 NULL NULL 
21 NULL NULL 
22 NULL NULL 
23 NULL NULL 
24 NULL NULL 
25 NULL NULL 
26 NULL NULL 
27 NULL NULL 
28 NULL NULL 
29 NULL NULL 
30 NULL NULL 
31 NULL NULL 
32 NULL NULL 
33 NULL NULL 
34 NULL NULL 
35 NULL NULL 
36 NULL NULL 
37 NULL NULL 
38 NULL NULL 
39 NULL NULL 
40 NULL NULL 
41 NULL NULL 
42 NULL NULL 
43 NULL NULL 
44 NULL NULL 
45 NULL NULL 
46 NULL NULL 
47 NULL NULL 
48 NULL NULL 
49 NULL NULL 
50 NULL NULL 
51 NULL NULL 
52 NULL NULL 
53 NULL NULL 
54 NULL NULL 
55 NULL NULL 
56 NULL NULL 
57 NULL NULL 
58 NULL NULL 
59 NULL NULL 
60 NULL NULL 
61 NULL NULL 
62 NULL NULL 
63 NULL NULL 
64 NULL NULL 
65 NULL NULL 
66 NULL NULL 
67 NULL NULL 
68 NULL NULL 
69 NULL NULL 
70 NULL NULL 
71 NULL NULL 
72 NULL NULL 
73 NULL NULL 
74 NULL NULL 
75 NULL NULL 
76 NULL NULL 
77 NULL NULL 
78 NULL NULL 
79 NULL NULL 
80 NULL NULL 
81 NULL NULL 
82 NULL NULL 
83 NULL NULL 
84 NULL NULL 
85 NULL NULL 
86 NULL NULL 
87 NULL NULL 

テーブルインデックスカウントは正しいですが、値の代わりにヌルがあります。 誰かが値を取得するコードを修正する方法を教えてください。あなたのピボット利用の選択 キャスト(varchar型としてhist_timestamp(最大))では、事前

+0

あなたの@colsを選択してください、それはあなたが持っていると思いますか? –

+0

実行前に 'print @ query'を追加してください。 – Peter

答えて

2

おかげhist_timestampとして代わりに。

stuff_timestampはstuffクエリでvarcharに変換されるため、その値は 'Aug 14 2017 12:18 PM'のように変更されます。しかし、テーブルのデータは、datetime - '2017-08-14 12:19:01.000'の形式で利用できます。正しいマッチングのためには、選択句hist_timestampをvarcharに変換してください。

use eta_user 
DECLARE @cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.HIST_TIMESTAMP) 
    FROM eta_user.ANALOG_HISTORY c 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

set @query = 'SELECT TABLE_INDEX, ' + @cols + ' from 
    (
     select table_index 
      , value 
      ,Cast(hist_timestamp as varchar(max))as hist_timestamp  
from eta_user.analog_history 
    ) x 
    pivot 
    (
     max(value) 
     for HIST_TIMESTAMP in (' + @cols + ') 
    ) p ' 
+0

Kalipありがとう、今それは私のためにうまくいきます。 – Vineet

+1

素晴らしい!私の答えがあなたを助けたならば、アップしてください、またはマークしてください:) – Kapil

+0

私はここで新しいです、あなたはそれを行う方法を教えてください – Vineet

関連する問題