SQL 基于分组依据的字符串聚合

SQL string aggregation based on a group by

我有一个INT数据集,varchar。整数可以分组为 1 到 5 的小集合,我想查看所有对应文本的计数。例如。输入table(格式apols)

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

我可以按 Int 分组,但不知道如何跨行连接。在上面我想知道的计数:

a,2
ab,1
aqz,1

我能否完全在 SQL 中执行此操作,最好是以通用的数据库不可知的方式?

如果您使用 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

Demo on 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

Demo on 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

Demo on SQLFIddle

在 Postgre 中SQL 你也可以使用 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

Demo on SQLFiddle

在所有情况下,输出都是:

STR     COUNT
a       2
ab      1
aqz     1

您可以在 SQL 服务器中使用 string_agg()。在此处查看演示 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 

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;