Поскольку вы не можете использовать псевдонимы столбцов в предложении SELECT
, есть несколько других способов сделать это.Либо добавьте еще одну условную агрегацию к вашему запросу:
SELECT
SUM(case when s1 = 'fel' then 1 else 0 end) as s1_count,
SUM(case when s2 = 'fel' then 1 else 0 end) as s2_count,
SUM(case when s3 = 'fel' then 1 else 0 end) as s3_count,
SUM(case when s4 = 'fel' then 1 else 0 end) as s4_count,
SUM(case when s1 = 'fel' or s2 = 'fel' or s3 = 'fel' or s4 = 'fel' then 1 else 0 end) as total
FROM `arrest`
WHERE date BETWEEN '2018-12-01' AND '2019-03-01'
Обратите внимание, что это предполагает, что только один из s1
, s2
, s3
или s4
будет равен fel
для любогозаданная строка.
Более надежный метод заключается в использовании исходного запроса в качестве подзапроса:
SELECT *, s1_count+s2_count+s3_count+s4_count AS total
FROM (SELECT
SUM(case when s1 = 'fel' then 1 else 0 end) as s1_count,
SUM(case when s2 = 'fel' then 1 else 0 end) as s2_count,
SUM(case when s3 = 'fel' then 1 else 0 end) as s3_count,
SUM(case when s4 = 'fel' then 1 else 0 end) as s4_count
FROM `arrest`
WHERE date BETWEEN '2018-12-01' AND '2019-03-01') a
Обратите внимание, что, поскольку MySQL рассматривает логическое выражение в числовом контексте как 1 (true)или 0 (ложь), вы можете упростить эти запросы следующим образом:
SELECT
SUM(s1 = 'fel') as s1_count,
SUM(s2 = 'fel') as s2_count,
SUM(s3 = 'fel') as s3_count,
SUM(s4 = 'fel') as s4_count,
SUM((s1 = 'fel') + (s2 = 'fel') + (s3 = 'fel') + (s4 = 'fel')) as total
FROM `arrest`
WHERE date BETWEEN '2018-12-01' AND '2019-03-01'
SELECT *, s1_count+s2_count+s3_count+s4_count AS total
FROM (SELECT
SUM(s1 = 'fel') as s1_count,
SUM(s2 = 'fel') as s2_count,
SUM(s3 = 'fel') as s3_count,
SUM(s4 = 'fel') as s4_count
FROM `arrest`
WHERE date BETWEEN '2018-12-01' AND '2019-03-01') a
Это устранит проблему, возникшую в первом запросе, из-за которой требуется только один из s1
, s2
, s3
или s4
будет равно fel
для любой данной строки.