我完全坚持编写SQL代码来处理我必须生成报告的任务的最佳方法。我们使用Sybase ASA。它嵌入了一个应用程序。查询需要生成以下输出:
媒体服务器|备份总数|卷大小(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 :(得分: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(*)
获得百分比成功 - 与以前一样,在这种情况下,你不会得到你想要的CASE表达式中的COUNT(*)等聚合函数(我认为Sybase会接受,但你会得到整体COUNT,我认为打破GROUP BY - 不要在这里做。)
您还有一个问题 - 为什么要按statusCode进行分组?应该这样做,因为你正在查看每个媒体服务器的所有工作,而不是在成功/失败之间将它们分开,而是计算成功/失败率的统计数据。所以只需在服务器名称上进行分组。
此外是什么:
COUNT(distinct dj.id)
我原本以为你已经有一个明确的清单 - 如果你必须这样做,它告诉我你每个工作有多行,这样就会打破你的统计数据。
ALSO:
WHERE DATEDIFF(day, UtcBigIntToNomTime(dj.endTime), GETDATE()) <= 7
AND dj.Type != '17'
AND dj.statusCode = 0
你限制成功的工作!我想你应该重新开始 - 首先选择sql来选择作业,确保它是正确的。如果您需要失败率,您也必须选择失败。 然后,使用SUM(CASE ..)技术计算您需要的结果GROUPING BY。 我认为你需要仔细再次建立查询,因为目前存在太多问题。