This may not be the best formatted SQL statement, as I am no SQL expert, but we use variations of this SQL to do availability percentages of QOS metrics.
SELECT target, (CAST(ROUND((AVG((CASE WHEN RN_QOS_DATA_0094.samplevalue IS NULL THEN CAST(0 AS Decimal(15,3)) ELSE
CAST(1 AS Decimal(15,3)) END)) * 100),3,0) AS Decimal(15,3))) AS Availability
FROM S_QOS_DATA, RN_QOS_DATA_0094
WHERE qos='QOS_URL_RESPONSE'
AND RN_QOS_DATA_0094.table_id = S_QOS_DATA.table_id
AND (getdate()-RN_QOS_DATA_0094.sampletime) < 30
AND target LIKE '%Amway.%'
GROUP BY target
ORDER BY Availability DESC
So basically what this does is return two things, either 1 or 0. If it didn't record a response time it sends "0" if it does it sends "1". We then calculate avaialbility based on those returns. Depending on the table ID's and QOS you are going after some of the details may need to change. I've used this for Oracle Database Uptime, SQL Uptime, etc. Seems to work rather well.
I'm adding what we did for Oracle and SQL as well, as the query is slightly different:
============= Oracle Availability
SELECT DISTINCT target, CONVERT(VARCHAR(20),CAST(ROUND((AVG(ISNULL(RN_QOS_DATA_0042.samplevalue,0)) * 100),3,0) AS Decimal(15,3))) + '%' AS AverageAvailability
FROM S_QOS_DATA, RN_QOS_DATA_0042
WHERE qos='QOS_ORACLE_CHECK_DBALIVE'
AND RN_QOS_DATA_0042.table_id = S_QOS_DATA.table_id
AND (getdate()-RN_QOS_DATA_0042.sampletime) < 30
GROUP BY target
ORDER BY AverageAvailability DESC
============= SQL Server Availability
SELECT DISTINCT target, CONVERT(VARCHAR(20),CAST(ROUND((AVG(ISNULL(RN_QOS_DATA_0068.samplevalue,0)) * 100),3,0) AS Decimal(15,3))) + '%' AS AverageAvailability
FROM S_QOS_DATA, RN_QOS_DATA_0068
WHERE qos='QOS_SQLSERVER_CHECK_DBALIVE'
AND RN_QOS_DATA_0068.table_id = S_QOS_DATA.table_id
AND (getdate()-RN_QOS_DATA_0068.sampletime) < 30
GROUP BY target
ORDER BY AverageAvailability DESC
Hope that this helps some.
Thanks,
Dave