2012-10-16 35 views
0

select devicename, name, value, timestamp from table1给我的下面,SQL Server 2008中查询在线

DEVICENAME  NAME  VALUE TIMESTAMP 
123   CURRENT 130  2012-10-16 13:00:00.000 
123   AVG  140  2012-10-16 13:00:00.000 
123   MIN  100  2012-10-16 13:00:00.000 
123   MAX  160  2012-10-16 13:00:00.000 

我如何让他们像这样的SQL查询,

123, 130, 140, 100, 160 2012-10-16 13:00:00.000 
+0

您是否希望将该输出作为以逗号分隔的列表(即显示的内容)还是单独的列? – egrunin

回答

2
select 
    devicename, 
    MAX(CASE WHEN Name = 'CURRENT' THEN value ELSE NULL END), 
    MAX(CASE WHEN Name = 'AVG' THEN value ELSE NULL END), 
    MAX(CASE WHEN Name = 'MIN' THEN value ELSE NULL END), 
    MAX(CASE WHEN Name = 'MAX' THEN value ELSE NULL END), 
    timestamp 
from table1 
GROUP BY devicename, timestamp 
+0

太棒了!有效! – Fonzy

+0

如果我需要将'CURRENT'值分配给平均值,最小值或最大值,如果平均值,最小值,最大值为空值,该怎么办? – Fonzy

+0

您可以使用@bluefeet提供的pivot示例,如果这些值为NULL,则使用Current。 – msmucker0527

0

,你可以将它们串联成一列

select a + ' '+ b as Column1 from yourtable 

或将它们作为输出变量返回

+0

我不认为这回答了这个问题。 – egrunin

0
SELECT x.devicename, * 
FROM 
    (SELECT devicename, value as 'current', timestamp 
    FROM table1 WHERE name = 'current') x 
INNER JOIN 
    (SELECT devicename, value as [avg] FROM table1 WHERE name = 'avg') y 
    ON x.devicename = y.devicename 
INNER JOIN (SELECT devicename, value as [min] FROM table1 WHERE name = 'min') z 
    ON x.devicename = z.devicename 
INNER JOIN (SELECT devicename, value as [max] FROM table1 WHERE name = 'max') q 
    ON x.devicename = q.devicename 
3

您可以使用PIVOT对于这一点,如果你想这在单独的列:

select devicename, [Current], [Avg], [Min], [Max], timestamp 
from 
(
    select devicename, name, value, timestamp 
    from table1 
) x 
pivot 
(
    max(value) 
    for name in ([Current], [Avg], [Min], [Max]) 
) p 

SQL Fiddle with Demo

如果你想在同一列的所有值,那么你就可以请使用以下内容:

select devicename, 
    STUFF((SELECT distinct ', ' + cast(value as varchar(10)) 
       from table1 t2 
       where t1.DEVICENAME = t2.DEVICENAME 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') name, 
    timestamp 
from table1 t1 
group by devicename, timestamp 

请参阅SQL Fiddle with Demo

+0

Nice的解决方案 – msmucker0527

-1
create table table1 (devicename varchar(10) 
       ,name varchar(100) 
       ,value varchar(10) 
       ,TimeSTamp datetime) 

INSERT INTO table1 
SELECT '123','CURRENT','130','2012-10-16 13:00:00.000' 
UNION 
SELECT '123','AVG','140','2012-10-16 13:00:00.000' 
UNION 
SELECT '123','MIN','100','2012-10-16 13:00:00.000' 
UNION 
SELECT '123','MAX','160','2012-10-16 13:00:00.000' 


select devicename, name, value, timestamp from table1 


SELECT DISTINCT t1.devicename 
    , value_list 
    , t1.timestamp 
    FROM table1 t1 
INNER JOIN (SELECT t2.devicename 
        , t2.timestamp 
        , value_list = SUBSTRING((SELECT t3.value 
               + ', ' 
               FROM table1 t3 
              WHERE t3.devicename = t2.devicename 
               AND t3.timestamp = t2.timestamp 
              ORDER BY t3.value 
               FOR XML PATH('')),1,LEN((SELECT t3.value 
                      + ', ' 
                      FROM table1 t3 
                     WHERE t3.devicename = t2.devicename 
                      AND t3.timestamp = t2.timestamp 
                     ORDER BY t3.value 
                      FOR XML PATH(''))) -1) 
       FROM table1 t2 
       GROUP BY t2.devicename 
        , t2.timestamp) t4 on t4.devicename = t1.devicename 
             AND t4.timestamp = t1.timestamp 


drop table1