Как я могу посчитать строки в более чем одно «затем» из Postgres искомого выражения регистра? (составление отчетов) - PullRequest
1 голос
/ 21 апреля 2020

Фон

У меня есть база данных Postgres 11, работающая на RDS. Мне нужно создать отчет, который показывает количество событий за определенный период, группировку, переименование и подсчет их на основе строк описания в категории в соответствии с бизнес-требованиями.

Проблема Для такого рода вещей я обычно go для искомого выражения case, который работает хорошо , за исключением : для части spe c требуется некоторые события должны быть отнесены к более чем одной категории. Но когда вычисляется выражение case, оно подсчитывает [или, кажется, подсчитывает] каждую строку только в одной категории [первой соответствующей в выражении].

Пример:

     SELECT 
          CASE 
            WHEN (some_table.description ILIKE '%foo%' OR some_table.description ILIKE ‘%foobar%') THEN 'foo' 
            WHEN (some_table.description ILIKE '%bar%' OR some_table.description ILIKE ‘%foobar%) THEN 'bar'
          END AS ‘category’,
          count(*)
    FROM some_table 
    GROUP BY category
    ORDER BY category DESC
    ;

Итак, данные, подобные


event_id         |   description
---------------------------------
1                |    ‘string including foo’
2                |   ‘foo also included in this string’
3                |   ‘ this string includes bar’
4                |   ‘this one says foobar’

, ожидаемые выходные данные выглядят так:

some_table
category         |      count
---------------------------------
foo              |    3
bar              |    2

Однако фактическое выходные данные возвращаются как

some_table
category         |      count
---------------------------------
foo              |    3
bar              |    1  

Как получить записи с описанием, содержащими 'foobar', для подсчета в категории 'foo' и 'bar'? И если выражение для случая является неправильным методом для этой цели отчетности, что следует использовать? Все указания приветствуются!

1 Ответ

1 голос
/ 21 апреля 2020

Выход останавливается при первом совпадении. Если вы хотите и то и другое, используйте боковое соединение:

SELECT v.category, COUNT(*)
FROM some_table t CROSS JOIN LATERAL
     (VALUES (CASE WHEN s.description ILIKE '%foo%' OR s.description ILIKE '%foobar%' THEN 'foo' END),
             (CASE WHEN s.description ILIKE '%bar%' OR s.description ILIKE '%foobar% THEN 'bar' END)
     ) v(category)
WHERE v.category IS NOT NULL
GROUP BY v.category
ORDER BY v.category DESC
;
...