Использование CASE для установки условия для оператора COUNT в SQLite - PullRequest
1 голос
/ 10 октября 2019

У меня есть оператор SELECT в SQLite, где мне нужно найти количество автомобилей, зарегистрированных на человека в прошлом году. Это запрос:

SELECT
p.fname,
p.lname,
p.bdate,
p.bplace,
COUNT(
  DISTINCT CASE r.vin WHEN r.regdate >= date('now', '-1 years') THEN 1 ELSE null END
),
COUNT(DISTINCT(t.violation))
FROM
persons p
LEFT JOIN registrations r ON p.fname = r.fname
AND p.lname = r.lname
LEFT JOIN tickets t ON r.regno = t.regno
GROUP BY
p.fname,
p.lname,
p.bdate,
p.bplace;

Проблема в операторе CASE, он не определяет, когда условие выполняется, и по умолчанию все мои значения равны 0. Как это исправить, или есть другие способы? ускорить условие в выражении COUNT

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Вы можете использовать FILTER (SQLite 3.30.0):

SELECT
   p.fname, p.lname, p.bdate, p.bplace,
   COUNT(DISTINCT r.vin) FILTER (WHERE r.regdate >= date('now', '-1 years')),
   COUNT(DISTINCT(t.violation))
FROM persons p
LEFT JOIN registrations r ON p.fname = r.fname
  AND p.lname = r.lname
LEFT JOIN tickets t ON r.regno = t.regno
GROUP BY p.fname, p.lname, p.bdate,p.bplace;
0 голосов
/ 10 октября 2019

Я предполагаю, что вы хотите это:

COUNT(DISTINCT CASE WHEN r.regdate >= date('now', '-1 years') THEN r.vin END)

, потому что COUNT(DISTINCT 1) не имеет смысла. ELSE null не требуется.

...