在条件存在时添加所有出现

时间:2016-05-06 16:56:15

标签: sql sybase sqlanywhere

我完全坚持编写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,因为它嵌入在应用程序中。

感谢。

1 个答案:

答案 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。 我认为你需要仔细再次建立查询,因为目前存在太多问题。