2017-08-14 42 views
0

我有設計如下表。動態數據透視在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 

我有如下我的表中的數據:

總的
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 

3744表的索引和數據每分鐘轉動轉換存儲所有表的索引

現在我想我的時間戳作爲柱,我試圖使用樞軸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 ' 

執行(@query)

但輸出有空,我不知道爲什麼。輸出的屏幕是:

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 

表索引計數是正確的,但空值代替值。 有人請幫助我如何更正代碼來獲取值。

在此先感謝

+0

選擇你的@cols,它有你期望它有嗎? –

+0

執行前添加'print @ query'。 – Peter

回答

2

在選擇您的數據透視使用 演員(hist_timestamp爲varchar(MAX))爲hist_timestamp代替。

hist_timestamp正在被轉換爲varchar查詢東西,因此它的值更改爲'Aug 14 2017 12:18 PM'。但表格數據的格式爲datetime-'2017-08-14 12:19:01.000'。因此,爲了正確匹配,還應將select子句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