Справка по SQL, чтобы превратить данные из двух столбцов в ряд - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь создать представление для мониторов производительности Windows.Проблема, с которой я столкнулся, состоит в том, что в таблице, которую я назвал «AllPerf», есть два столбца с именами «PerfCounter» и «Приложение», в которых есть несколько разных имен счетчиков производительности и приложений.

В идеале, я хочу, чтобы мои столбцы: время, компьютер, имя приложения, а затем имена всех строк PerfCounter в столбцах.

Я создал представление только имен строкЯ хочу, и с текущим представлением, которое я создал ниже, я получаю этот вывод:

-----------------------------------------------------------------------
| mem.AlertTime       | Computer | PerfCounter | Application | Value  |
-----------------------------------------------------------------------
| 2019-03-15 14:49:02 | WEB-04   | Vrt_Bytes   | System      |0.1368  |
| 2019-03-15 14:49:02 | WEB-05   | Vrt_Bytes   | System      |2440    |
| 2019-03-15 14:49:02 | WEB-06   | Handles     | w3wp        |1508    |
| 2019-03-15 14:49:02 | WEB-04   | Page_Faults | System      |0.00419 |
| 2019-03-15 14:49:02 | WEB-04   | Prvt_Bytes  | System      |0.1368  |
-----------------------------------------------------------------------

Я пробовал решения по этой ссылке ниже, но когда я могу успешно перечислить имена строк в виде столбцов, я получаюЗначения не заполняются под столбцами. Эффективное преобразование строк в столбцы на сервере SQL

И поскольку у меня нет большого опыта работы с SQL в целом, я не могу экстраполировать простые примеры с моими более сложными данными

Это то, что я использую для своего оператора SELECT для моего текущего представления.

SELECT  mem.AlertTime, 
    Computer, 
        CASE WHEN mem.PerfCounter = 'Virtual Bytes' THEN 'Virt_Bytes' 
    WHEN mem.PerfCounter = 'Private Bytes' THEN 'Prvt_Bytes' 
    WHEN mem.PerfCounter = 'Page Faults/sec' THEN 'Page_Faults_Sec' 
    WHEN mem.PerfCounter = 'Thread Count' THEN 'Threads' 
    WHEN mem.PerfCounter LIKE '%Handle%' THEN 'Handles' 
    END AS PerfCounter, 
    PerfInstance AS Application, 
    Value
FROM    dbo.AllPerf AS mem

И то, что я хочу, выглядит примерно так:

--------------------------------------------------------------------------------------------
| mem.AlertTime       | Computer |Application| Vrt_Bytes| Prvt_Bytes| Handles| Page_Faults |
-------------------------------------------------------------------------------------------
| 2019-03-15 14:49:02 | WEB-04   | System    | 12440     | 24.13    |   13   |   0.14      |
| 2019-03-15 14:49:02 | WEB-04   | w3wp      | 7396      | 4.2309   |   13   |    0        |
| 2019-03-15 14:49:02 | WEB-05   | w3wp      | 1538      | 0.1368   |  1538  |    0        |
| 2019-03-15 14:49:02 | WEB-05   | System    | 6629      | 6500     |  1835  |    5        |
| 2019-03-15 14:49:02 | WEB-06   | System    | 2440      | 0.1368   |   13   |    0        |
--------------------------------------------------------------------------------------------

И еслиУ меня было желание «пирог в небе», я бы преобразовал MBytes в Mem_Bytes в ГБ, но я не смог успешно сделать операторы CASE и включить в результат математику

1 Ответ

0 голосов
/ 02 апреля 2019

Я создал таблицу переменных @MYTAB, в которой я использовал для проверки сценария ниже

Вы можете заменить @MYTAB на весь вид, который вы использовали в своем посте

Вот код, дайте мне знать, если он вам подходит enter image description here

DECLARE @MYTAB AS table(AlertTime datetime,Computer varchar(50),PerfCounter varchar(50),Application varchar(50),Value decimal(10,5))

insert into @mytab 
values('2019-03-15 14:49:02','WEB-04'   , 'Vrt_Bytes', 'System' ,'0.1368') ,
('2019-03-15 14:49:02' , 'WEB-05'   , 'Vrt_Bytes'   , 'System'      ,2440    ),
('2019-03-15 14:49:02' , 'WEB-06'   , 'Handles'     , 'w3wp'        ,1508    ),
('2019-03-15 14:49:02' , 'WEB-04'   , 'Page_Faults' , 'System'      ,0.00419 ),
('2019-03-15 14:49:02' , 'WEB-04'   , 'Prvt_Bytes'  , 'System'      ,0.1368  )


select alerttime,computer,application,piv.*
 from @MYTAB d
 pivot

 ( max(value)  for perfcounter in ([vrt_bytes],[handles],[page_faults]) ) piv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...