Sql server 2008 不知道如何做到这一点;合并“;T-SQL中的类型查询

Sql server 2008 不知道如何做到这一点;合并“;T-SQL中的类型查询,sql-server-2008,tsql,Sql Server 2008,Tsql,我有如下原始数据: 我想执行一个T-SQL查询,将数据以以下形式显示: 这几乎像是一个UnPivot类型的查询,但我不知道如何去做。还有一点需要澄清。LastModifiedTime列的值可以是每个子ID的五个值中的任意一个。到底是哪一个并不重要 非常感谢你的帮助 select * from ( select subgroupid, coater, metrictypedescription, subgroupvalue, valuedescription from myt

我有如下原始数据:

我想执行一个T-SQL查询,将数据以以下形式显示:

这几乎像是一个UnPivot类型的查询,但我不知道如何去做。还有一点需要澄清。LastModifiedTime列的值可以是每个子ID的五个值中的任意一个。到底是哪一个并不重要

非常感谢你的帮助

select * from 
(
    select subgroupid, coater, metrictypedescription, subgroupvalue, valuedescription
    from mytable
) data

PIVOT(
     sum(subgroupvalue) 
     FOR valuedescription IN ([Average],[Minimum],[Maximum],[Standard Deviation],[xWebRange])
     ) TOTALS
-

可以是任何聚合函数,因为每个函数只有一个值,这真的不重要

产生这个

编辑:
如果您确实需要最后一个修改的列,那么您需要像BlueFoots那样在子查询中添加联接。

有两种方法可以做到这一点,或者使用静态透视,在其中硬编码需要透视的值:

create table temp
(
    subgroupid int,
    coater varchar(10),
    metricTypeDescriptor varchar(5),
    subgroupvalue decimal(20, 6),
    valuedescription varchar(50),
    lastmodfiedtime datetime
)

insert into temp values(28099, 'VA_A', 'CdSim', 2.99886, 'Average', '2012-05-03 20:55:02.14')
insert into temp values(28099, 'VA_A', 'CdSim', 2.57201, 'Minimum', '2012-05-03 20:55:02.14')
insert into temp values(28099, 'VA_A', 'CdSim', 3.1646, 'Maximum', '2012-05-03 20:55:02.143')
insert into temp values(28099, 'VA_A', 'CdSim', 0.22082, 'Standard Deviation', '2012-05-03 20:55:02.153')
insert into temp values(28099, 'VA_A', 'CdSim', 0.59259, 'xWebRange', '2012-05-03 20:55:02.157')

insert into temp values(28102, 'VA_A', 'CdSim', 2.9091, 'Average', '2012-05-03 21:00:01.27')
insert into temp values(28102, 'VA_A', 'CdSim', 2.67619, 'Minimum', '2012-05-03 21:00:01.27')
insert into temp values(28102, 'VA_A', 'CdSim', 3.17471, 'Maximum', '2012-05-03 21:00:01.27')
insert into temp values(28102, 'VA_A', 'CdSim', 0.191868, 'Standard Deviation', '2012-05-03 21:00:01.27')
insert into temp values(28102, 'VA_A', 'CdSim', 0.49852, 'xWebRange', '2012-05-03 21:00:01.27')

insert into temp values(28104, 'VA_A', 'CdSim', 3.05835, 'Average', '2012-05-03 21:05:01.383')
insert into temp values(28104, 'VA_A', 'CdSim', 2.80336, 'Minimum', '2012-05-03 21:05:01.387')
insert into temp values(28104, 'VA_A', 'CdSim', 3.17943, 'Maximum', '2012-05-03 21:05:01.387')
insert into temp values(28104, 'VA_A', 'CdSim', 0.158743, 'Standard Deviation', '2012-05-03 21:05:01.39')
insert into temp values(28104, 'VA_A', 'CdSim', 0.37607, 'xWebRange', '2012-05-03 21:05:01.40')

select subgroupid, coater, metrictypedescriptor
    , [average]
    , [maximum]
    , [minimum]
    , [standard deviation]
    , lastmodfiedtime
from 
(
    select t1.subgroupid, t1.coater, t1.metrictypedescriptor, t1.valuedescription, t1.subgroupvalue, t2.lastmodfiedtime
    from temp t1
    left join 
    (
        select subgroupid, max(lastmodfiedtime) as lastmodfiedtime
        from temp 
        group by subgroupid
    ) t2
        on t1.subgroupid = t2.subgroupid
) x
pivot
(
    max(subgroupvalue)
    for valuedescription in([Average], [Minimum], [Maximum], [Standard Deviation])
) p


drop table temp
或者,您可以通过动态透视来实现这一点,在动态透视中,您可以动态创建列列表,然后透视它们:

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

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

set @query = 'SELECT subgroupid, coater, metrictypedescriptor, ' + @cols + ', lastmodfiedtime from 
            (
                select t1.subgroupid, t1.coater, t1.metrictypedescriptor, t1.valuedescription, t1.subgroupvalue, t2.lastmodfiedtime
                from temp t1
                left join 
                (
                    select subgroupid, max(lastmodfiedtime) as lastmodfiedtime
                    from temp 
                    group by subgroupid
                ) t2
                    on t1.subgroupid = t2.subgroupid
                ) x
            pivot
            (
                max(subgroupvalue)
                for valuedescription in(' + @cols + ')
            ) p '

execute(@query)

实际上,不需要使用
PIVOT
,就可以相当轻松地完成这一任务。其思想是使用
MAX
和case语句从分组中选择行并将它们转换为列。您的
groupby
是您希望返回的所有列,这些列在整个组中都是一致的

SELECT SubGroupId, Coater, MetricTypeDescriptor,
    MAX(CASE WHEN ValueDescription = 'Average'
             THEN SubGroupValue END) as Average,
    MAX(CASE WHEN ValueDescription = 'Minimum'
             THEN SubGroupValue END) as Minimum,
    MAX(CASE WHEN ValueDescription = 'Maximum'
             THEN SubGroupValue END) as Maximum,
    MAX(CASE WHEN ValueDescription = 'Standard Deviation'
             THEN SubGroupValue END) as "Standard Deviation",
    MAX(LastModifiedTime) as LastModifiedTime
FROM YourTable
GROUP BY SubGroupId, Coater, MetricTypeDescriptor

看不到您的帖子中包含的图片。您可以在SQL 2008中执行该操作。@David-稍等几秒钟-它们很慢,但确实会出现。
SELECT SubGroupId, Coater, MetricTypeDescriptor,
    MAX(CASE WHEN ValueDescription = 'Average'
             THEN SubGroupValue END) as Average,
    MAX(CASE WHEN ValueDescription = 'Minimum'
             THEN SubGroupValue END) as Minimum,
    MAX(CASE WHEN ValueDescription = 'Maximum'
             THEN SubGroupValue END) as Maximum,
    MAX(CASE WHEN ValueDescription = 'Standard Deviation'
             THEN SubGroupValue END) as "Standard Deviation",
    MAX(LastModifiedTime) as LastModifiedTime
FROM YourTable
GROUP BY SubGroupId, Coater, MetricTypeDescriptor