2013-11-19 2 views
0

Я хочу сворачивать данные в моей базе данных с помощью SQL-скрипта. Вот как это выглядит в таблице.Как повернуть строки в таблице с условием?

id name  state cpu_usage memory_usage datetime 
1 machine-2 Running 50.6693  5060099372  2013-11-18 17:00:22.550 
2 machine-3 Running 19.8329  14951967776  2013-11-18 17:00:22.550 
3 machine-4 Running 24.2103  3309923047  2013-11-18 17:00:22.550 
4 machine-2 Running 97.2774  2867303718  2013-11-18 17:01:22.550 
5 machine-3 Running 66.2991  11048043786  2013-11-18 17:01:22.550 
6 machine-5 Running 26.6446  13362336682  2013-11-18 17:01:22.550 
7 machine-2 Running 39.5881  6969468931  2013-11-18 17:02:22.550 
8 machine-3 Running 99.0000  9340168327  2013-11-18 17:02:22.550 
9 machine-4 Running 85.0968  16154409604  2013-11-18 17:02:22.550 

Вот как я хочу, чтобы результат выглядел как для использования ЦП.

Date      machine-2 machine-3 machine-4 machine-5 
2013-11-18 17:00:22.550  50.6693  19.8329  24.2103  null 
2013-11-18 17:01:22.550  97.2774  66.2991  null  26.6446 
2013-11-18 17:02:22.550  39.5881  99.0000  85.0968  null 

Как это сделать с SQL?

ответ

3

Существует несколько различных способов получения результата.

Вы можете использовать агрегатную функцию с выражением CASE, с помощью условной логики для создания новых столбцов:

select datetime, 
    max(case when name = 'machine-2' then cpu_usage end) machine2, 
    max(case when name = 'machine-3' then cpu_usage end) machine3, 
    max(case when name = 'machine-4' then cpu_usage end) machine4, 
    max(case when name = 'machine-5' then cpu_usage end) machine5 
from yourtable 
group by datetime; 

См SQL Fiddle with Demo

Или вы можете применить функцию PIVOT, которая преобразует ваши name значения в колонок:

select datetime, 
    [machine-2], [machine-3], 
    [machine-4], [machine-5] 
from 
(
    select datetime, name, cpu_usage 
    from yourtable 
) d 
pivot 
(
    max(cpu_usage) 
    for name in ([machine-2], [machine-3], [machine-4], [machine-5]) 
) piv; 

См. SQL Fiddle with Demo.

Вышеуказанные две версии будут работать для вас, если у вас есть ограниченное количество значений для name столбцов, но если нет, то вам нужно будет посмотреть на использование динамического SQL:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT datetime,' + @cols + ' 
      from 
      (
       select datetime, name, cpu_usage 
       from yourtable 
      ) x 
      pivot 
      (
       max(cpu_usage) 
       for name in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

См SQL Fiddle with Demo. Все версии дают результат:

|      DATETIME | MACHINE-2 | MACHINE-3 | MACHINE-4 | MACHINE-5 | 
|---------------------------------|-----------|-----------|-----------|-----------| 
| November, 18 2013 17:00:22+0000 | 50.6693 | 19.8329 | 24.2103 | (null) | 
| November, 18 2013 17:01:22+0000 | 97.2774 | 66.2991 | (null) | 26.6446 | 
| November, 18 2013 17:02:22+0000 | 39.5881 |  99 | 85.0968 | (null) | 
+0

Спасибо за ваш ответ. Это то, чего я хочу. Я также обнаружил, что SQL Fiddle очень полезен (я знал только jsfiddle). – Anonymous

Смежные вопросы