2011-01-11 7 views
5

У меня есть следующий простой запрос,Если условие условие на агрегатные функции

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO) as Issues 
FROM ISSUES I JOIN USERS U ON I.IS_ASSIGNED_USER_ID = U.US_USER_ID 
WHERE I.IS_RECEIVED_DATETIME BETWEEN 20110101000000 AND 20110107000000 
GROUP BY U.US_LOGON_NAME; 

Где я хочу, чтобы добавить дополнительные COUNT() функции в списке выбора, но накладывают определенные условия, где на них. Это делается с помощью оператора CASE() каким-то образом? Я попытался поставить предложения Where внутри списка выбора, и это, похоже, не разрешено. Я не уверен, что здесь понадобятся подзапросы, но я так не думаю.

Например, я хочу функцию один COUNT(), которая учитывает только вопросы в пределах определенного диапазона, то другой в другом диапазоне или других различных условий и т.д.:

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO (condition here) 
COUNT(I.IS_ISSUE_NO (a different condition here) 

и т.д ...

Все еще сгруппированы по имени входа.

Спасибо.

ответ

10
SELECT 
    SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND1 
    SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND2 
+0

Не 'COUNT' рассчитывать' 0'? Я думал, что «NULL» не учитывается. –

+1

@Kirk Woll: Где он говорит COUNT в своем ответе? –

+0

Да, но Адам не COUNTING, он SUMming. –

4

Пару решений.

Вы можете воспользоваться тем, что SQL не COUNT NULL значения:

SELECT US_LOGON_NAME as Username, 
    COUNT(CASE WHEN <cond>  THEN I.IS_ISSUE_NO ELSE NULL END) 
    COUNT(CASE WHEN <other cond> THEN I.IS_ISSUE_NO ELSE NULL END) 
    . . . 

Или вы можете использовать SUM вместо COUNT:

SELECT US_LOGON_NAME as Username, 
    SUM(CASE WHEN <cond>  THEN 1 ELSE 0 END) 
    SUM(CASE WHEN <other cond> THEN 1 ELSE 0 END) 
    . . . 

В любом случае, вы можете повторить много раз, как вам нужно.

+1

Я думаю, что ваши выражения 'CASE', вероятно, являются недопустимым синтаксисом, потому что нет' END'. –

+0

Я думаю, что вы правы, сэр. Я просто обновил синтаксис. Не нужно торопиться. –

0

Пример возвращает количество пользователей, за IssueType.

; 
with 
q_00 as (
select 
     is_issue_no 
    , is_assigned_user_id 
    , case 
      when is_issue_no between 1 and 10 then 'A' 
      when is_issue_no between 11 and 14 then 'B' 
      else 'C' 
     end as IssueType 
from Issues 
) 
select 
     us_logon_name 
    , IssueType 
    , count(1) as cnt 
from q_00 as a 
join users as u on a.is_assigned_user_id = u.us_user_id 
group by us_logon_name, IssueType 
order by us_logon_name, IssueType ; 

SQL сервер 2005 +

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