#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
Ваш текущий запрос подсчитывает все строки «событие 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]