Я ищу некоторые встроенные функции Postresql, которые могут подсчитывать значения строк (не столбцов) с некоторыми условиями. Какой-то аналог
=countif(a:a;"Yes")
в Excel
Я видел много ответов на симулированные проблемы здесь на stackoverflow, но все решения предоставлены, когда вы фильтруете данные в столбцах таблицы, а не в строках. Но мне нужно разобрать данные в строках. Мне не нравится решение с кросс-таблицей, так как исходный выбор имеет более 60 столбцов и предпочитает не выполнять один и тот же запрос дважды (но я сделаю это, если это единственное решение).
В некоторых тестовых примерах, где следуетбыть последним столбцом "num_of_yes", который отображает количество ответов "Да" в строке. Тестовые данные
CREATE TABLE main_data (
id serial PRIMARY KEY,
name VARCHAR(255) default NULL,
lastname VARCHAR(255) default NULL,
username VARCHAR(255) default NULL,
job VARCHAR(255) default NULL,
age integer default NULL,
licenseid integer default NULL,
account integer default NULL
);
INSERT INTO main_data VALUES(1,'Jhon', 'Brown', 'jbrown', 'some job', 35, 11112333, 3333455);
INSERT INTO main_data VALUES(2,'Bob', NULL, 'bob', 'another job', 64, 1000500, 5555252);
INSERT INTO main_data VALUES(3,'Mike', 'McDonald', 'mike', NULL, 8, NULL, NULL);
Выбор запроса:
select id, name,
case when lastname notnull then 'Yes'::text else 'No'::text end as "has_lastname",
case when username notnull then 'Yes'::text else 'No'::text end as "has_username",
case when job notnull then 'Yes'::text else 'No'::text end as "has_job",
case when age < 16 then 'Yes'::text else 'No'::text end as "is_child",
case when licenseid notnull then 'Yes'::text else 'No'::text end as "has_licenseid",
case when account notnull then 'Yes'::text else 'No'::text end as "has_account"
from main_data
order by id;
У меня есть следующий вывод для моего запроса на выборку:
| id | name | has_lastname | has_username | has_job | is_child | has_licenseid | has_account |
|----|------|--------------|--------------|---------|----------|---------------|-------------|
| 1 | Jhon | Yes | Yes | Yes | No | Yes | Yes |
| 2 | Bob | No | Yes | Yes | No | Yes | Yes |
| 3 | Mike | Yes | Yes | No | Yes | No | No |
Мне нужно добавить последний столбец сколичество ответов «Да».
Желаемый вывод должен быть таким:
| id | name | has_lastname | has_username | has_job | is_child | has_licenseid | has_account | num_of_yes |
|----|------|--------------|--------------|---------|----------|---------------|-------------|------------|
| 1 | Jhon | Yes | Yes | Yes | No | Yes | Yes | 5 |
| 2 | Bob | No | Yes | Yes | No | Yes | Yes | 4 |
| 3 | Mike | Yes | Yes | No | Yes | No | No | 3 |
Я использую Postgresql 9.6.5