Вычисляемая строка из сводного запроса

Я пытаюсь написать простой агрегированный запрос, но с чем-то борюсь.

У меня есть таблица с полем статуса "Завершено" или "Незавершено". Я хочу, чтобы запрос возвращал три строки: количество выполненных, количество незавершенных и рассчитанный процент выполнения.

Пока у меня есть первые две строки как

     SELECT Status, Count(*) as countNums FROM tblStuff GROUP BY Status

Итак, это вернет что-то вроде

 Status    Countnums
 __________         
 Complete  100
 Incomplete 100

И то, что я хочу, это

 Status    Countnums      Percent
 __________         
 Complete  100             50
 Incomplete 100            50

OR

 Status    Countnums      
 __________         
 Complete  100            
 Incomplete 100           
 percentComplete     50

Хотя я не понимаю, как последний будет работать на уровне строки. Это в MS Access.


person Scotch    schedule 08.12.2012    source источник
comment
MS Access и MS SQL Server — это два разных продукта баз данных. Правильно ли вы используете MS Access, а не SQL Server?   -  person ErikE    schedule 09.12.2012
comment
Я хотел пометить SQL, думаю, я также случайно пометил SQLServer. Я просто использую обычный доступ без бэкэнда SQL Server. отредактировано.   -  person Scotch    schedule 09.12.2012


Ответы (3)


Вы можете использовать свой существующий запрос GROUP BY в качестве подзапроса и перекрестно соединить его с другим подзапросом, который возвращает общее количество из tblStuff. Используйте значения подзапроса для получения [Percent] в родительском запросе.

Это сработало (правильный результат; синтаксическая ошибка отсутствует) с Access 2007:

SELECT
    group_counts.Status,
    group_counts.countNums,
    (group_counts.countNums / total_count.total_nums * 100) AS [Percent]
FROM
    (
        SELECT Status, Count(*) AS countNums
        FROM tblStuff GROUP BY Status
    ) AS group_counts,
    (
        SELECT Count(*) AS total_nums
        FROM tblStuff
    ) AS total_count;

Помните, что Percent — зарезервированное слово. Использование его в качестве псевдонима без заключения в квадратные скобки вызвало ошибку.

person HansUp    schedule 08.12.2012

В SQL-СЕРВЕРЕ

SELECT Status, Count(*) AS cnt, CAST( Count(*) as decimal) / (SELECT COUNT(*) FROM tblStuff) AS perc 
FROM tblStuff 
GROUP BY Status

Вы даже можете сохранить полный счет в переменной

DECLARE @fcnt decimal

SELECT @fcnt = COUNT(*) FROM tblStuff
SELECT Status, Count(*) AS cnt,Count(*) / @fcnt AS perc 
    FROM tblStuff 
    GROUP BY Status

В доступе

SELECT tblStuff.Status, Count(*) AS cnt, (SELECT COUNT(*) FROM tblStuff as t1) AS fcnt, [cnt]/[fcnt] AS perc
FROM [tblStuff]
GROUP BY tblStuff.Status
person Blim    schedule 08.12.2012
comment
Я не думаю, что операция приведения поддерживается в MS ACCESS, я получаю синтаксические ошибки. - person Scotch; 09.12.2012

Это сделает работу просто отлично.

SELECT
   Status,
   Count(*) AS CountNums,
   Count(*) / DCount("*", "tblStuff") AS Pct
FROM
   tblStuff
GROUP BY Status

Вы можете получить общее количество относительно, но на самом деле это не отличается по производительности и, возможно, понятнее.

person ErikE    schedule 08.12.2012
comment
Хм, я пытался заменить квадратные скобки круглыми и удалить точку, а также использовать псевдонимы без AS, и я все еще получаю синтаксические ошибки. - person Scotch; 09.12.2012