确定。假设我有临时表所代表的数据。
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'at的数据,以及每个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)
答案 0 :(得分:0)
您需要确保对于每个ID,传递给pivot函数的所有DateTransmitted
值都相等,您可以使用以下内容执行此操作:
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);
<强> Example on SQL-Fiddle 强>