sql - 获取 sql 表列中唯一组合的计数

标签 sql database postgresql

假设您有一个包含以下列和 100,000 行的顾客表的数据库:

CREATE TABLE patron (
  id       INT,
  name     VARCHAR(100),
  deptA    INT,
  deptB    INT,
  deptC    INT
 );

一些示例行如下:

+----+------+-------+-------+-------+
| id | name | deptA | deptB | deptC |
+----+------+-------+-------+-------+
| 1  | Bob  |  1    |   1   | NULL  |
| 2  | Bill | NULL  |   2   | NULL  |
| 3  | Mike |  3    | NULL  | NULL  |
| 4  | John |  4    |   4   |   4   |
| 5  | Matt | NULL  | NULL  |   5   |
| 6  | Jack |  6    |   6   | NULL  |
| 7  | Sean |  7    |   7   |   7   |
| 8  | Adam |  8    |   8   |   8   |
+----+------+-------+-------+-------+

我想要一个这样的表(A = 仅部门 A,B = 仅部门 B,C = 仅部门 C,AB = 部门 A 和 B,等等):

+-----------+------------+
| Department| User Count |
+-----------+------------+
| A         |     40,121 |
| B         |     25,663 |
| C         |     13,925 |
| AB        |      6,253 |
| AC        |      5,870 |
| BC        |      5,123 |
| ABC       |      3,045 |
+-----------+------------+

如果某个部门的值为 NULL,则该人将被视为不属于该部门。例如,如果我只是 A 部门的一部分,则 A 部门的值将是我的 id 值,而 B 部门和 C 部门的值将是 NULL。

执行此操作的 SQL 查询是什么?我不知道如何找到独特的(不同的)组合并使它们成为自己的专栏。

最佳答案

您应该使用单个聚合来执行此操作:

select concat_ws(',',
                 (case when deptA > 0 then 'A' end),
                 (case when deptB > 0 then 'B' end),
                 (case when deptC > 0 then 'C' end)
                ) as Department
        count(*)
from patron
group by Department
order by length(Department), Department;

关于sql - 获取 sql 表列中唯一组合的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42568862/

相关文章:

.net - SQL:在汇总表上将 1 列扩展为 3 列

mysql - 从非sql查询获取结果集

version-control - 数据库的版本控制

java - 第二次访问时为空数据

sql - 以此比例因子查询耗尽的资源

mysql - 如何在MySQL服务器中使用 'where'中的情况

database - 如果表上有索引,如何处理表更新/插入

php - 如何使用javascript和数据库mysql创建数组?

postgresql - 在 PostgreSQL 中选择字符串的值

sql - 在postgresql中实现除法查询