Получение нескольких подсчетов из таблицы на строку возвращает неверные результаты подсчета - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь показать список клиентов и количество оценок, которые они оставили по типу. Однако результаты подсчетов не являются точными.

Это происходит на SQL сервере.

Я собрал репрезентативную схему и тестовые данные здесь: http://sqlfiddle.com/#! 9 / 97908f3 / 5

select customer.custid, customer.name,
(
  select count(eventid) from event
  where type in ('x', 'y')
  and rating = 'good'
  and event.stayid = stay.stayid
) as 'Goods',
(
  select count(eventid) from event
  where type in ('x', 'y')
  and rating = 'ok'
  and event.stayid = stay.stayid
) as 'OKs',
(
  select count(eventid) from event
  where type in ('x', 'y')
  and rating = 'bad'
  and event.stayid = stay.stayid
) as 'Bads'
from customer, stay
where stay.custid = customer.custid

Результаты показывают:

custid  name    Goods   OKs Bads
1       Jane    1       0   1
2       Alice   1       0   1

Согласно данным, у Алисы не должно быть 1 хорошего отзыва. Я пробовал тот же запрос, что и объединения, но получил ту же проблему.

Что я делаю неправильно, когда пытаюсь запросить одну и ту же таблицу для нескольких подсчетов в строке?

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Здесь вы должны использовать один запрос с условной агрегацией:

SELECT
    c.custid,
    c.name,
    COUNT(CASE WHEN e.rating = 'good' THEN 1 END) AS Goods,
    COUNT(CASE WHEN e.rating = 'ok'   THEN 1 END) AS Oks,
    COUNT(CASE WHEN e.rating = 'bad'  THEN 1 END) AS Bads
FROM customer c
LEFT JOIN stay s
    ON s.custid = c.custid
LEFT JOIN event e
    ON e.stayid = s.stayid AND
       e.type IN ('x', 'y')
GROUP BY
    c.custid,
    c.name;
1 голос
/ 07 января 2020

@ Библброкс, то, что Тим предложил правильно. Исходя из этого, я внес несколько изменений ниже.

Select C.CustId, C.Name,
      COUNT(CASE WHEN E.Rating = 'good' THEN 1 END) AS Goods,
      COUNT(CASE WHEN E.Rating = 'ok'   THEN 1 END) AS Oks,
     COUNT(CASE WHEN E.Rating = 'bad'  THEN 1 END) AS Bads
From Customer C LEFT JOIN Stay S ON S.CustId = C.CustId
LEFT Join Event E On E.CustId = S.CustId And E.Type In ('x', 'y')
Group By C.CustId, C.Name

См. Результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...