количество объектов не использует список - PullRequest
0 голосов
/ 31 мая 2019

У меня есть оператор SQL:

SELECT
  p.id
  ,SUM(CASE WHEN pf.facility_code in ('S','H','E') then 1 ELSE 0 END) as facility_count
FROM people p
  inner JOIN people_facilities pf ON p.ID = pf.ID
group by p.id

и из вышеприведенного утверждения вы поймете, что значение instance_count не может быть больше 3. Однако в первом списке в списке насчитывается 18 объектов.

Я имею в виду считать с регистром и списком

Почему этот счетчик не работает?

Ответы [ 2 ]

1 голос
/ 31 мая 2019

После объединения может существовать несколько строк с одинаковым id и одинаковым facility_code.
Итак, сначала получите разные пары этих столбцов, а затем сгруппируйте и агрегируйте:

SELECT
  t.id,
  SUM(CASE WHEN t.facility_code in ('S','H','E') then 1 ELSE 0 END) as facility_count
FROM (
  SELECT DISTINCT p.id, pf.facility_code
  FROM people p inner JOIN people_facilities pf 
  ON p.ID = pf.ID
) t
group by t.id
1 голос
/ 31 мая 2019

Если вы хотите посчитать количество различных объектов, используйте count(distinct):

SELECT p.id,
       COUNT(DISTINCT CASE WHEN pf.facility_code in ('S','H','E') THEN pf.facility_code END) as facility_count
FROM people p JOIN
     people_facilities pf
     ON p.ID = pf.ID
GROUP BY p.id;

Ваш запрос подозрительный. Я бы ожидал, что JOIN будет больше похоже на pf.PeopleID = p.id.

Если нет, этот запрос можно упростить, удалив JOIN, потому что ID, по которому вы агрегируете, находится в таблице people_facilities. Я также подозреваю, что условие может быть перемещено в предложение WHERE:

SELECT pf.id, COUNT(DISTINCT pf.facility_code) as facility_count
FROM people_facilities pf
WHERE pf.facility_code IN ('S', 'H', 'E')
GROUP BY pf.id;
...