2017-08-14 21 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

相关问题