2014-10-26 5 views
-1

У меня есть запрос, в котором курс (C1, C5, C9 ... и т. Д.) Должен отображать учетную запись пользователей со статусом DONE/NOT DONE/PENDING. Обратите внимание, что курс может быть DONE/NOT DONE или PENDING:SQL Query :: CASE Условие

count(u.userid) ll.law_name ll.law_course ll.law_lesson ll.score ll.status 
4     Berlyin   C1   L1    6.05  Done 
8     Berlyin   C1   L1    NULL  Not Done 

4     Elance   C9   L6    3.4  Done 
7     Elance   C9   L6    NULL  Not Done 

2     Indix   C5   L12    5.5  Done 
3     Indix   C10   L3    NULL Not Done 


SELECT count(DISTINCT(u.userid)), ll.law_name, ll.law_course, ll.law_lesson, 
CASE WHEN ll.score >=0 THEN Done 
    WHEN ll.score <0 THEN Not Done 
    WHEN ll.score !=0 THEN pending END AS "status" 
FROM 
users u JOIN law_courses ll ON u.id = ll.userid GROUP BY ll.law_lesson 
+0

Ваше выражение при перекрытии. Первые два охватывают всю вселенную реалов (но не «нуль»), поэтому третий не имеет смысла. Пожалуйста, покажите примерные баллы и объясните правила для статуса. – Mat

+2

Итак, в чем вопрос? – dotnetom

+0

Я просто хочу показать статус урока для каждого курса с подсчетом количества выполненных в одной строке и не выполненного в одной строке и, наконец, Ожидание в одной строке – Saranya

ответ

1

Основная идея состоит в том, чтобы поставить case заявление в group by. Ваша логика для трех групп не имеет смысла (или, по крайней мере, «ожидающая» группа не существует). Но это может привести вас к правильному пути:

SELECT count(*), ll.law_name, ll.law_course, ll.law_lesson, 
     (CASE WHEN ll.score >= 0 THEN 'Done' 
      WHEN ll.score < 0 THEN 'Not Done' 
      ELSE 'Pending' 
     END) as status 
FROM users u JOIN 
    law_courses ll 
    ON u.id = ll.userid 
GROUP BY ll.law_name, ll.law_course, ll.law_lesson, 
     (CASE WHEN ll.score >= 0 THEN 'Done' 
       WHEN ll.score < 0 THEN 'Not Done' 
       ELSE 'Pending' 
      END); 
+0

:: Thank You очень .. это сработало для меня .. сделал небольшие изменения – Saranya

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