У меня есть таблица SQLite, в которой есть столбец, содержащий категории, в которые может попасть каждая строка.Каждая строка имеет уникальный идентификатор, но может относиться к нулю, одной или нескольким категориям, например:
|-------+-------|
| name | cats |
|-------+-------|
| xyzzy | a b c |
| plugh | b |
| quux | |
| quuux | a c |
|-------+-------|
Я хотел бы получить количество элементов в каждой категории.Другими словами, вывод выглядит так:
|------------+-------|
| categories | total |
|------------+-------|
| a | 2 |
| b | 2 |
| c | 2 |
| none | 1 |
|------------+-------|
Я пытался использовать оператор case
так:
select case
when cats like "%a%" then 'a'
when cats like "%b%" then 'b'
when cats like "%c%" then 'c'
else 'none'
end as categories,
count(*)
from test
group by categories
Но проблема в том, что подсчитывается только каждая строка один раз , поэтому он не может обрабатывать несколько категорий.Вместо этого вы получите следующий вывод:
|------------+-------|
| categories | total |
|------------+-------|
| a | 2 |
| b | 1 |
| none | 1 |
|------------+-------|
Одна из возможностей - использовать столько union
операторов, сколько у вас есть категорий:
select case
when cats like "%a%" then 'a'
end as categories, count(*)
from test
group by categories
union
select case
when cats like "%b%" then 'b'
end as categories, count(*)
from test
group by categories
union
...
, но это кажется действительно уродливым и противоположнымСУХОЙ.
Есть ли лучший способ?