Если вы чувствуете, что отрицательные индексы в нарезке сбивают с толку, вот очень простой способ подумать об этом: просто замените отрицательный индекс на len - index
. Например, замените -3 на len(list) - 3
.
Лучший способ проиллюстрировать, что нарезка делает внутри, просто показывает ее в коде, который реализует эту операцию:
def slice(list, start = None, end = None, step = 1):
# take care of missing start/end parameters
start = 0 if start is None else start
end = len(list) if end is None else end
# take care of negative start/end parameters
start = len(list) + start if start < 0 else start
end = len(list) + end if end < 0 else end
# now just execute for-loop with start, end and step
return [list[i] for i in range(start, end, step)]
В основном вы будете использовать COUNT
для суммирования по UID. Поэтому
COUNT([uid])
выдаст предупреждение:
Внимание: значение Null исключается с помощью агрегата или другой операции SET.
blockquote>, в то время как используется с левым соединением, где подсчитанный объект не существует.
Использование
COUNT(*)
в этом случае также приводило бы к неправильным результатам, так как тогда вы считали бы общее количество результатов (т. е. родители), которые существуют.Использование
COUNT([uid])
Является допустимым способом подсчета, и предупреждение является не чем иным, как предупреждением. Однако если вы заинтересованы, и вы хотите получить истинное количество uids в этом случае, вы можете использовать:SUM(CASE WHEN [uid] IS NULL THEN 0 ELSE 1 END) AS [new_count]
Это не добавило бы много накладных расходов на ваш запрос. (проверено mssql 2008)
Вы хотите поместить ISNULL
внутри функции COUNT
, а не снаружи:
Не GOOD: ISNULL(COUNT(field), 0)
GOOD: COUNT(ISNULL(field, 0))
Использовать ISNULL(field, 0)
Его также можно использовать с агрегатами:
ISNULL(count(field), 0)
Однако вы можете рассмотреть возможность изменения count(field) to count(*)
Редактировать:
попробуйте:
closedcases = ISNULL(
(select count(closed) from ticket
where assigned_to = c.user_id and closed is not null
group by assigned_to), 0),
opencases = ISNULL(
(select count(closed) from ticket
where assigned_to = c.user_id and closed is null
group by assigned_to), 0),
Если какое-либо значение Null существует внутри агрегатной функции, вы столкнетесь с этой проблемой. Вместо ниже кода
SELECT Count(closed)
FROM ticket
WHERE assigned_to = c.user_id
AND closed IS NULL
используйте как
SELECT Count(ISNULL(closed, 0))
FROM ticket
WHERE assigned_to = c.user_id
AND closed IS NULL
Один из способов решения этой проблемы - отключить предупреждения.
SET ANSI_WARNINGS OFF;
GO