我的表设计如下。
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
表索引计数是正确的,但是来的是null而不是值。 任何人请帮助我如何纠正代码以获得价值。
提前致谢
答案 0 :(得分:2)
在您的枢轴使用选择中 而将(hist_timestamp as varchar(max))转换为hist_timestamp。
hist_timestamp在stuff查询中被转换为varchar,因此它的值会变为'2017年8月14日下午12:18'。但是表格数据的格式为datetime-'2017-08-14 12:19:01.000'.So,为了正确匹配,也将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 '