Как присвоить значение 0, если строка не соответствует требованиям - PullRequest
1 голос
/ 18 апреля 2019

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

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

SELECT A_NAME, COUNT(MR_ROLE) 
FROM ACTOR JOIN MOVIEROLE ON ACTOR.A_ID = MOVIEROLE.A_ID 
WHERE MOVIEROLE.MR_ROLE LIKE '%UNCREDITED%'
GROUP BY A_NAME;

Вот результаты вышеприведенного запроса

Это форматы таблицЯ использую:

ACTOR TABLE:

 (A_ID INTEGER NOT NULL,      
  A_NAME CHAR(25) NOT NULL,
  A_YOB INTEGER NOT NULL,)

MOVIEROLE TABLE:

(MR_ID INTEGER NOT NULL,      
  A_ID INTEGER NOT NULL,
  M_ID INTEGER NOT NULL,
  MR_ROLE CHAR(45),  
  PRIMARY KEY (MR_ID),
  FOREIGN KEY(A_ID) REFERENCES ACTOR,
  FOREIGN KEY(M_ID) REFERENCES MOVIE)

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Вам нужно LEFT JOIN, чтобы вернуть 0 s:

SELECT a.A_NAME, COUNT(mr.MR_ROLE) 
FROM ACTOR a LEFT JOIN
     MOVIEROLE mr
     ON a.A_ID = mr.A_ID AND
        mr.MR_ROLE LIKE '%UNCREDITED%'
GROUP BY a.A_NAME;
0 голосов
/ 18 апреля 2019

Вместо использования в конце выражения where вы можете переместить его в выражение case внутри функции count и использовать тот факт, что count пропускает null s:

SELECT   A_NAME, COUNT(CASE WHEN MR_ROLE LIKE '%UNCREDITED%' THEN 1 END) 
FROM     ACTOR
JOIN     MOVIEROLE ON ACTOR.A_ID = MOVIEROLE.A_ID
GROUP BY A_NAME;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...