SQL агрегирование строк по группам по - PullRequest
1 голос
/ 16 апреля 2020

У меня есть набор данных INT, varchar. Интты могут быть сгруппированы в небольшие наборы от 1 до 5, и я хочу увидеть количество всех соответствующих текстов. Например, таблица ввода (apols для формата)

 1,a
 2,a
 2,b
 3,a
 3,q 
 3,z
 4,a

Я могу группировать по Int, но понятия не имею, как я могу объединить строки. Выше я хотел бы знать количество:

a,2
ab,1
aqz,1

Могу ли я сделать это чисто в SQL, в идеале в общем c дБ агностии c способ?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

Если вы используете MySQL, вы можете использовать GROUP_CONCAT для объединения символов в строки для каждого целочисленного значения, затем COUNT вхождения каждой строки:

SELECT str, COUNT(*) AS count
FROM (SELECT GROUP_CONCAT(str ORDER BY str SEPARATOR '') AS str
      FROM data
      GROUP BY i) d
GROUP BY str 
ORDER BY str

Демонстрация на SQLFiddle

В Oracle вы можете использовать LISTAGG:

SELECT str, COUNT(*) AS count
FROM (SELECT LISTAGG(str, '') WITHIN GROUP (ORDER BY str) AS str
      FROM data
      GROUP BY i) d
GROUP BY str 
ORDER BY str

Демонстрация на SQLFiddle

В SQL Server 2017 и выше вы можете использовать STRING_AGG:

SELECT str, COUNT(*) AS count
FROM (SELECT STRING_AGG(str, '') WITHIN GROUP (ORDER BY str) AS str
      FROM data
      GROUP BY i) d
GROUP BY str 
ORDER BY str

Демонстрация по SQLFIddle

В PostgreSQL вы также можете использовать STRING_AGG:

SELECT str, COUNT(*) AS count
FROM (SELECT STRING_AGG(str, '' ORDER BY str) AS str
      FROM data
      GROUP BY i) d
GROUP BY str 
ORDER BY str

Демонстрация по SQLFiddle

Во всех случаях вывод:

STR     COUNT
a       2
ab      1
aqz     1
1 голос
/ 16 апреля 2020

Sybase поддерживает функцию LIST(). Итак:

select chrs, count(*) as cnt
from (select t.number, list(t.chr, '' order by t.chr) as chrs
      from t
      group by t.number
     ) n
group by chrs
order by count(*) desc;
0 голосов
/ 16 апреля 2020

Вы можете сделать, используя string_agg() на SQL сервере. проверить демо здесь sqlfiddle

select 
  cnct_str, 
  count(*) as count
from
(
    select 
        string_agg(chars, '') within group (order by chars) as cnct_str
    from tabs
    group by id
) val
group by cnct_str 
...