SQL фильтрация по значениям - PullRequest
1 голос
/ 30 июня 2011

У меня есть такая таблица:

id | userid | operation_id | category | date
===============================================
1   bobdole   2              Major      2011-02-20
2   bobdole   3              Major      2011-02-20
3   bobdole   2              Minor      2011-02-20
4   bobdole   2              Minor      2011-02-20
5   bobdole   2              Minor      2011-02-21
6   not_bob   2              Minor      2011-02-21

И я хотел бы написать запрос так, чтобы в каждой записи отображалось количество основных и второстепенных ошибок в день на человека.Например:

userid  | operation_id | Major faults| Minor faults | date
=================================================================
bobdole   2              1            2             2011-02-20
bobdole   3              1            0             2011-02-20
bobdole   2              0            1             2011-02-21
not_bob   2              0            1             2011-02-21

Как мне сказать, что я хотел бы подсчитать идентификатор пользователя, operation_id, количество ошибок, которые = "Major", количество ошибок, которые = "Minor" и сгруппированы по дате?

Вот что я попробовал:

SELECT employee, operation_id, date_entered, orgin, grading, 
       COUNT(grading = "Major"), count(grading = "Minor") 
  FROM faults 
  JOIN company.tblusers on faults.employee = compeny.tblusers.sugar_name 
 WHERE ncr_ncr.date_entered > date("2011-01-01")
   AND protocase.tblusers.departmentid = 8
   AND orgin != "unknown" 
   AND orgin != "Unknown"
   AND orgin IS NOT NULL
GROUP BY employee, date_entered, operation_id

РЕДАКТИРОВАТЬ: Это сработало:

select 
  employee, 
  userid,
  operation_id, 
  date(date_entered), 
  orgin,  
  SUM(case when grading = 'Major' then 1 else 0 end), 
  SUM(case when grading = 'Minor' then 1 else 0 end) 
from ncr_ncr 
join company.tblusers on ncr_ncr.employee = company.tblusers.sugar_name 
where 
ncr_ncr.date_entered > date("2011-01-01") 
and company.tblusers.departmentid = 8
and orgin != "unknown" 
and orgin != "Unknown"
and date_entered is not null
and orgin is not null
AND(grading = "Minor" or grading = "Major")
group by employee, date(date_entered), operation_id
order by date(date_entered), employee, operation_id

Ответы [ 3 ]

4 голосов
/ 30 июня 2011
select 
  userid, operationid,
  sum(case category when 'Major' then 1 else null end) MajorFaults,
  sum(case category when 'Minor' then 1 else null end) MinorFaults,
  date
from YourTable
group by userid, operationid, date
1 голос
/ 30 июня 2011

Как-то так может работать

SELECT userid, operation_id,
SUM(
   SELECT COUNT(category)
   FROM  faults F
  WHERE CATEGORY = 'Major'
  AND F.ID = ID
) AS MajorFaults,
SUM
(
   SELECT COUNT(category)
   FROM  faults F
   WHERE CATEGORY = 'Minor'
   AND F.ID = ID
) AS MinorFaults,
DATE
join company.tblusers on faults.employee = compeny.tblusers.sugar_name 
where ncr_ncr.date_entered > date("2011-01-01")
and protocase.tblusers.departmentid = 8
and orgin != "unknown" 
and orgin != "Unknown"
and orgin is not null    
group by userid, date, operation_id
1 голос
/ 30 июня 2011
select userid, operation_id,
sum(case when category = 'Major' then 1 else 0 end) as Major_faults,
sum(case when category = 'Minor' then 1 else 0 end) as Minor_faults,
date
from mytable
group by userid, operation_id, date
...