2016-05-06 7 views
2

Я полностью застрял на том, как написать код SQL для обработки задачи, которую я должен подготовить. Мы используем Sybase ASA. Он встроен в приложение. Запрос должен произвести следующий вывод:Добавьте все случаи, когда существует условие

Медиа-сервер | Всего NUmber резервных копий | Размер тома (KB) | Средняя пропускная способность | Количество успешных | Успех в работе%

Каждый медиа-сервер будет уникальным.

У меня возникла проблема с получением количества успешных рабочих мест, а затем определения% успеха.

Вот код, у меня есть:

SELECT 
    dmj.name AS "Media Server", 
    CAST(SUM(dj.bytesWritten/1024/1024) as decimal(20,2)) as "Volume(MB)", 
    COUNT(distinct dj.id) AS "Total Number of Jobs", 
    CAST(AVG(dj.throughput) as decimal(10,2)) AS "Throughput (KB/sec)", 
    CASE 
     WHEN dj.statusCode = '0' 
     THEN COUNT (dj.statusCode) 
    END AS "Number of Successful Jobs" 
FROM domain_JobArchive dj 
INNER JOIN domain_MediaServer dmj 
ON dj.mediaServerName = dmj.name 
WHERE DATEDIFF(day, UtcBigIntToNomTime(dj.endTime), GETDATE()) <= 7 
    AND dj.Type != '17' 
    AND dj.statusCode = 0 
GROUP BY dmj.name, dj.statusCode 

Я также до сих пор не знает, как показать% успех.

Мы используем Sybase ASA, поскольку она встроена в приложение.

Спасибо.

+0

Интересно, является ли причиной проблемы проблема с частью statusCode. СЛУЧАЙ, содержащий совокупность, будет работать? Случай работает в строке, но агрегат находится над строками: я не думаю, что это сработает. Возможно, вам понадобится SUM (CASE, когда dj.statusCode = '0', а затем 1 else 0 end), чтобы получить количество успехов. Процент успешной - это выражение, деленное на COUNT (*). –

+0

Хороший пункт Abe. Я не знал, как обрабатываются данные CASE. Я попробую это и посмотрю, что он производит. – Opethian

+0

Как мне показать код для вычисления Процент? Было бы что-то вроде: SUM (CASE WHEN dj.statusCode = '0' THEN COUNT (dj.statusCode) END/COUNT (*)) AS "Success%" – Opethian

ответ

0

Так что:

SUM(CASE when dj.statusCode = '0' then 1 else 0 end) 

, чтобы получить количество успехов, а также:

SUM(CASE WHEN dj.statusCode = '0' THEN 1 else 0 END) * 100.0/ COUNT(*) 

, чтобы получить процент успеха - такой же, как и раньше, вы не получите то, что вы хотите с агрегатным функции, такие как COUNT (*) в выражении CASE в этой ситуации (я думаю, Sybase согласится с этим, но вы получите общий COUNT, и я думаю, что перерыв GROUP BY - не делайте этого здесь.)

Вы курить ее проблема - почему вы группируете по статусу? Это должно произойти, потому что вы просматриваете все задания на Media Server и не отделяете их от успеха/неудачи, а вы рассчитываете статистику по темпам успеха/отказа. Поэтому просто введите имя сервера.

Кроме того, что это:

COUNT(distinct dj.id) 

Я бы подумал, что вы бы четкий список уже - если вам нужно сделать, что подсказывает мне, у вас есть несколько строк на работу, так что будет разорвать вашу статистику.

ТАКЖЕ:

WHERE DATEDIFF(day, UtcBigIntToNomTime(dj.endTime), GETDATE()) <= 7 
AND dj.Type != '17' 
AND dj.statusCode = 0 

Вы ограничение успешных работ! Я думаю, вам следует начать все сначала - сначала сделайте sql, чтобы выбрать задания, убедитесь, что это правильно. Если вам нужны номера отказов, вам также придется выбирать сбои. Затем используйте технику SUM (CASE ..) для вычисления результатов, которые вам нужны, GROUP BY BY. Думаю, вам нужно тщательно создать запрос, потому что на данный момент слишком много проблем.

+0

Спасибо за разъяснение. Полностью оценен. Основываясь на ваших дополнительных заметках, я мог бы удалить «отличный». Также я ошибочно оставил код «dj.statuscode = 0». Я тестировал что-то перед публикацией. Опять же, спасибо Абэ. – Opethian

+0

можете ли вы продвигать, если разрешено? –