1

好的。假设我有临时表表示的数据。

create table temp
 (
     ID varchar(max),
     DateTransmitted datetime,
     tagname varchar(max),
     Operator varchar(max),
     Tanknumber varchar(max),
     value float
  )

insert into temp values ( '1gk','2012-01-01 00:00:00.000','TI|A','bob','TK1',   1000.00)    
insert into temp values ('1gk', '2012-01-01 00:00:00.000','TI|B','bob','TK1',  500.00)    
insert into temp values ( '1gk','2012-01-01 00:00:00.000','TI|C','bob','TK1',  800.00)    
insert into temp values ( '2gk','2012-01-01 00:00:00.000','TI|D','bob','TK1',  700.00)    
insert into temp values ( '1gk','2012-01-01 00:00:02.000','TI|E','bob','TK1', 1100.00)    
insert into temp values ( '1gk','2012-01-01 00:00:01.000','TI|F','bob','TK1', 1100.00)

我可以使用以下动态 sql 转换数据。

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX);

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

set @query = 'SELECT 
operator, DateTransmitted, tanknumber,' + @cols + ' from 
            (
                select ID
                    ,DateTransmitted
                    ,operator
                    ,Tanknumber
                    , value
                    , tagname
                from temp
           ) x
            pivot 
            (
                 max(value)
                for tagname in (' + @cols + ')
            ) p '

execute(@query)

drop table temp

问题在于临时表中的最后 2 个条目。日期不同;即使数据是相关的并且应该显示在同一行中,因为实际上每组数据的 ID 都不同。我的问题是我怎样才能得到这个查询的结果给出两行。1 带有 id '1gk' 的数据,另一个带有 '2gk' 的数据,每个 ID 的数据的平均或最小(哪个更容易)时间戳。

IE 1gk 会有以下数据

值('1gk'、'2012-01-01 00:00:00.000'、'TI|A'、'bob'、'TK1'、1000.00)

值('1gk'、'2012-01-01 00:00:00.000'、'TI|B'、'bob'、'TK1'、500.00)

值('1gk'、'2012-01-01 00:00:00.000'、'TI|C'、'bob'、'TK1'、800.00)

值('1gk'、'2012-01-01 00:00:00.000'、'TI|E'、'bob'、'TK1'、1100.00)

值('1gk'、'2012-01-01 00:00:00.000'、'TI|F'、'bob'、'TK1'、1100.00)

4

1 回答 1

0

您需要确保对于每个 IDDateTransmitted传递给枢轴函数的所有值都是相等的,您可以使用以下方法执行此操作:

DateTransmitted = MIN(DateTransmitted) OVER(PARTITION BY ID)

如果您的逻辑是您想要每个 ID 的第一个 DateTransmitted,如果不是,您可以根据需要更改聚合。

所以你的查询变成:

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX);

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

set @query = 'SELECT 
operator, DateTransmitted, tanknumber,' + @cols + ' from 
            (
                select ID
                    ,DateTransmitted = MIN(DateTransmitted) OVER(PARTITION BY ID)
                    ,operator
                    ,Tanknumber
                    , value
                    , tagname
                from temp
            ) x
            pivot 
            (
                    max(value)
                for tagname in (' + @cols + ')
            ) p ';

execute(@query);

SQL-Fiddle 示例

于 2013-06-20T10:19:45.073 回答