MySQL - возвращает count () столбца, даже если 0 результатов

0

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

     select t.TaskPriorityCode as priority,
count(tp.code) as count
   from task t
    LEFT JOIN priority tp on tp.code = t.TaskPriorityCode
       where t.companyId = 16
   and t.projectId = 4
    group by t.TaskPriorityCode

который возвращает:

CRITICAL    4
HIGH    1
LOW 1

Но, как вы можете видеть, статус задачи MEDIUM не отображается, поскольку он не имеет записей. Я бы хотел, чтобы этот запрос возвращал это:

CRITICAL    4
HIGH    1
LOW 1
MEDIUM 0

Ниже приведен некоторый SQL, чтобы дать вам снимок того, что я возился в dev, а также делать вставки.

CREATE TABLE 'priority' (
  'code' varchar(20) NOT NULL,
  'display' varchar(255) NOT NULL,
  'description' varchar(255) DEFAULT NULL,
  'metavalue' varchar(255) DEFAULT NULL,
  'createdAt' datetime NOT NULL,
  'updatedAt' datetime NOT NULL
) 

INSERT INTO 'priority' VALUES ('CRITICAL','Critical','Critical',NULL,'2018-04-08 18:36:51','2018-04-08 18:36:51'),('HIGH','High','High',NULL,'2018-04-08 18:36:51','2018-04-08 18:36:51'),('LOW','Low','Low',NULL,'2018-04-08 18:36:51','2018-04-08 18:36:51'),('MEDIUM','Medium','Medium',NULL,'2018-04-08 18:36:51','2018-04-08 18:36:51');

CREATE TABLE 'task' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'taskName' varchar(255) NOT NULL,
  'description' varchar(255) DEFAULT NULL,
  'startDt' datetime NOT NULL,
  'finishDt' datetime DEFAULT NULL,
  'estimatedHrs' float DEFAULT NULL,
  'completedHrs' float DEFAULT NULL,
  'active' tinyint(1) NOT NULL DEFAULT '1',
  'repetitiveDays' varchar(255) DEFAULT NULL,
  'createdAt' datetime NOT NULL,
  'submittedDt' datetime DEFAULT NULL,
  'closedDt' datetime DEFAULT NULL,
  'updatedAt' datetime NOT NULL,
  'deletedAt' datetime DEFAULT NULL,
  'assignorId' int(11) DEFAULT NULL,
  'assigneeId' int(11) DEFAULT NULL,
  'projectId' int(11) NOT NULL,
  'TaskStatusCode' varchar(20) NOT NULL,
  'TaskPriorityCode' varchar(20) NOT NULL,
  'companyId' int(11) NOT NULL
)


INSERT INTO 'task' VALUES (8,'My First Task  - Fix errors','My First Task  - Fix errors Description','2018-01-01 05:00:00','2018-01-01 05:00:00',100,50,1,'wed,sat,sun','2018-04-16 14:35:02','2018-04-16 15:06:56','2018-04-16 15:23:35','2018-05-13 23:43:56',NULL,13,13,4,'IN_PROGRESS','CRITICAL',16),(9,'Second Task - again fix errors','Second Task - again fix errors','2018-01-01 05:00:00','2018-05-01 04:00:00',50,10,1,'','2018-04-16 15:35:52',NULL,NULL,'2018-04-16 15:36:57',NULL,13,13,5,'IN_PROGRESS','MEDIUM',16),(10,'Third Task - again fix errors','Third Task - again fix errors','2018-04-01 04:00:00','2018-04-01 04:00:00',100,100,1,'','2018-04-16 15:36:36','2018-04-19 16:07:14','2018-04-19 16:07:36','2018-04-19 16:07:36',NULL,13,13,4,'CLOSED','LOW',16),(11,'Fourth Task - again fix errors','Third Task - again fix errors','2018-01-01 05:00:00','2018-05-01 04:00:00',200,0,1,'','2018-04-16 15:37:54',NULL,NULL,'2018-04-16 15:38:32',NULL,13,13,4,'ASSIGNED','HIGH',16),(12,'Fifth Task - again fix errors','Fifth Task - again fix errors','2018-01-01 05:00:00','2018-06-01 04:00:00',22,NULL,1,'','2018-04-16 15:39:49',NULL,NULL,'2018-04-16 15:39:49',NULL,13,13,4,'ASSIGNED','CRITICAL',16),(13,'Fix payment',NULL,'2018-05-04 04:00:00','2018-05-11 04:00:00',40,NULL,0,'','2018-05-04 14:50:31',NULL,NULL,'2018-05-04 14:53:34','2018-05-04 14:53:34',15,15,4,'ASSIGNED','CRITICAL',16),(14,'New','new','2018-05-01 04:00:00','0000-00-00 00:00:00',20,NULL,1,'','2018-05-13 23:44:50',NULL,NULL,'2018-05-13 23:44:50',NULL,13,13,4,'ASSIGNED','CRITICAL',16);
Теги:

1 ответ

2

Вам действительно нужно сначала перенести priority в запрос, так как вы знаете, что все строки из этой таблицы нужны. Затем присоедините к ней task и включите все критерии в условие соединения, что приводит к:

select tp.code as priority,
       COALESCE(count(t.TaskPriorityCode), 0) as count
  from priority tp
  LEFT JOIN task t
    on tp.code = t.TaskPriorityCode AND
       t.companyId = 16 and
       t.projectId = 4
  group by t.TaskPriorityCode

SQLFiddle здесь

Удачи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню