Группировка агрегатных функций SQL с предложением WHERE

#sql-server

#sql-сервер

Вопрос:

У меня есть таблица SQL, содержащая следующие данные:

сдвиг событие
сдвиг 1 0
сдвиг 1 1
сдвиг 2 0

Что мне нужно сделать, так это получить возвращаемый агрегат, сгруппированный по сдвигу, который отображает как общее количество вхождений сдвига, так и количество событий, произошедших за сдвиг. Что-то вроде этого:

 shift 1 - 2 - 1
shift 2 - 1 - 0
 

Запрос, который я пробовал совсем недавно, выглядит следующим образом:

 SELECT 
    shift,
    COUNT(shift) AS totalShifts,
    (SELECT COUNT(shift) FROM table WHERE event = 1) AS totalEvents
FROM table
GROUP BY shift
 

Этот запрос успешно возвращает общее количество смен для каждой уникальной смены, но продолжает возвращать общее количество событий = 1 независимо от сдвига для каждой смены:

 shift 1 - 2 - 1
shift 2 - 1 - 1
 

Я пробовал добавлять дополнительные группы и разделять данные таблицы, но я всегда получаю тот же результат. Что мне нужно добавить, чтобы заставить это работать по желанию?

Комментарии:

1. Вместо использования подзапроса sum(case when event = cast(1 as bit) then 1 end) ваш подзапрос работал бы, если бы у вас была корреляция на основе номера смены, но здесь в этом нет необходимости.

2. Это сработало. Я полагаю, что проблема заключалась в преобразовании битового типа

3. Да, вы не можете суммировать биты. Но это приведение на самом деле больше для индексации и документирования типа данных, который там используется. Это должно работать иначе, но было бы подразумеваемое приведение event , чтобы превратить его в int first . Результатом case int является суммируемое значение.

Ответ №1:

Что-то вроде этого должно работать:

 SELECT
    shift,
    COUNT(1) As totalShifts,
    SUM(CAST(event As int)) As totalEvents
FROM
    table
GROUP BY
    shift
 

Скрипка DB

Ваш текущий запрос подсчитывает все строки «событие 1» для каждой строки в результирующем наборе, независимо от сдвига.

Комментарии:

1. Я все еще получал то же самое, что и раньше, с этим. Имеет ли значение, имеет ли столбец события тип BIT?

2. @AddisonWaege Я вижу проблему; Я обновил свой ответ.

Ответ №2:

Вы можете использовать агрегированные функции Count и Sum с функцией Concat.

 Select Concat([shift],' - ', Count(*),' - ', Sum(Convert(int,[event])))
From [Table]
Group by [shift]
Order by [shift]