public StatisticsDto GetStatistics()
        {
            return(UseConnection(connection =>
            {
                string sql = @"
SELECT ""statename"" ""State"", COUNT(""id"") ""Count"" 
FROM """ + _options.SchemaName + @""".""job""
GROUP BY ""statename""
HAVING ""statename"" IS NOT NULL;

SELECT COUNT(""id"") 
FROM """ + _options.SchemaName + @""".""server"";

SELECT SUM(""value"") 
FROM """ + _options.SchemaName + @""".""counter"" 
WHERE ""key"" = 'stats:succeeded';

SELECT SUM(""value"") 
FROM """ + _options.SchemaName + @""".""counter"" 
WHERE ""key"" = 'stats:deleted';

SELECT COUNT(*) 
FROM """ + _options.SchemaName + @""".""set"" 
WHERE ""key"" = 'recurring-jobs';
";

                var stats = new StatisticsDto();
                using (var multi = connection.QueryMultiple(sql))
                {
                    var countByStates = multi.Read().ToDictionary(x => x.State, x => x.Count);

                    Func <string, long> getCountIfExists = name => countByStates.ContainsKey(name) ? countByStates[name] : 0;

                    stats.Enqueued = getCountIfExists(EnqueuedState.StateName);
                    stats.Failed = getCountIfExists(FailedState.StateName);
                    stats.Processing = getCountIfExists(ProcessingState.StateName);
                    stats.Scheduled = getCountIfExists(ScheduledState.StateName);

                    stats.Servers = multi.Read <long>().Single();

                    stats.Succeeded = multi.Read <long?>().SingleOrDefault() ?? 0;
                    stats.Deleted = multi.Read <long?>().SingleOrDefault() ?? 0;

                    stats.Recurring = multi.Read <long>().Single();
                }

                stats.Queues = _queueProviders
                               .SelectMany(x => x.GetJobQueueMonitoringApi(connection).GetQueues())
                               .Count();

                return stats;
            }));
        }