2016-01-18 7 views
0

Я перечисляю, сколько случаев каждый человек имеет в таблице. Я хотел бы включить всех, у кого есть дело вообще (нет отдельной таблицы пользователя), даже если на этой неделе у них нет дел.Включить строки, даже если число равно нулю

Мои текущие результаты:

PERSON CASES 
Jerry 1 
Tom  1 

Что Я ищу:

PERSON CASES 
Jerry 1 
Tom  1 
Spike 0 

Запрос я бегу в настоящее время:

DECLARE @now DATETIME = GETDATE() 

SELECT PERSON, COUNT(CASES) 
FROM TASKS 
WHERE CASEDATE > CONVERT(DATE, DATEADD(dd, -(DATEPART(dw, @now)-1), @now)) 
GROUP BY PERSON 
ORDER BY PERSON 

Как вы видите, мой where- предложение удаляет всех, у кого нет дел на этой неделе, поэтому я не уверен, как их включить.

Заранее спасибо.

+0

Чтобы уточнить, вы хотите, чтобы каждый 'PERSON' был доступен в вашей таблице TASKS с количеством случаев на прошлой неделе? –

+0

Переведите условие 'CASEDATE' из' WHERE' в 'COUNT' (используя выражение' CASE'.) – jarlh

+0

@EvaldasBuinauskas Это правильно. Я хочу, чтобы всех в «ЧЕЛОВЕКЕ» показывали, с каким количеством «СЛУЧАЙ» у них на прошлой неделе. – Phil

ответ

7

Один из способов сделать это было бы поставить условную логику внутри CASE, внутри агрегата:

DECLARE @now DATETIME = GETDATE() 

SELECT PERSON, SUM(CASE 
      WHEN CASEDATE > CONVERT(DATE, DATEADD(dd, -(DATEPART(dw, @now)-1), @now)) 
       THEN 1 ELSE 0 END) 
FROM TASKS 
GROUP BY PERSON 
ORDER BY PERSON 
+0

Отлично! Я удивлен, как на самом деле все получилось. EDIT: 'SUM' оказался верным. Извините недоразумение :) – Phil

+0

@Phil - потому что я превратил его в добавление либо '1', когда условие соответствует, либо' 0', когда это не так, 'SUM()', кажется, подсчитывает количество строк, в которых выполняется условие. В то время как 'COUNT()' будет видеть как «1», так и «0» как ненулевые значения и, следовательно, подсчитывать их, эффективно отменяя работу по размещению «CASE» там в первую очередь. –

3

Я хотел бы присоединиться к таблице TASK к таблице PERSON и использовать другой синтаксис, чтобы найти воскресенье :

SELECT 
    p.PERSON, 
    COUNT(t.CASES) cnt 
FROM PERSON p 
LEFT JOIN TASK t 
ON p.id = t.PERSON_FK 
WHERE t.CASEDATE > DATEADD(d, -1, DATEDIFF(d, -1, @now)/7 * 7) 
GROUP BY p.PERSON 
ORDER BY p.PERSON 
+0

Спасибо за альтернативу для поиска первого дня недели, но, как я уже говорил в оригинальном посте, 'PERSON' не находится в его собственной таблице. И «PERSON», и «CASES» являются столбцами в одной таблице «TASKS». – Phil

+0

Хорошо, я неправильно понял это: * Я хочу, чтобы все в ЧЕЛОВЕКЕ были показаны * Мысль, что означала, что ЧЕЛОВЕК был столом, может быть, таблица ПЕРСОНА была бы подходящей –

Смежные вопросы