sql 2012中的Dynamic Pivot,而不是值nulls正在进行中

时间:2017-08-14 07:32:48

标签: sql sql-server

我的表设计如下。

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而不是值。 任何人请帮助我如何纠正代码以获得价值。

提前致谢

1 个答案:

答案 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 '