sql - 添加一个汇总行,其中包含每个子句的总计

标签 sql postgresql

我不知道如何制作这个 sql select 语句,我使用 PostgreSQL 数据库。 这是我的表格:

enter image description here

我想添加一个额外的行来显示按性别划分的客户数量:

enter image description here

这可以做到吗?

最佳答案

您可以使用GROUP BY GROUPING SETS (Postgresql 9.5+):

CREATE TABLE customers(idcust INT, name VARCHAR(100), fkGender INT);
INSERT INTO customers(idcust, name, fkGender)
SELECT 1, 'bob', 3 UNION ALL SELECT 2, 'alice', 3  UNION ALL SELECT 3, 'mikel', 4;

CREATE TABLE gender(IdGender INT, gender VARCHAR(100));
INSERT INTO gender(IdGender, gender) VALUES (3, 'male'),(4,'female');

-------------------------------------------------------------------------------------
SELECT CASE WHEN idcust::text IS NULL THEN 'Total' ELSE idcust::text END AS IdCust,
       CASE WHEN name IS NOT NULL THEN name ELSE COUNT(*)::text END AS name,
       CASE WHEN idcust::text IS NULL THEN '' ELSE gender END AS genderName
FROM customers c
JOIN gender g
  ON c.fkGender = g.idGender
GROUP BY GROUPING SETS((idcust, name, gender), (gender))
ORDER BY gender DESC, idcust;

输出:

enter image description here

请记住,idcust 可能是 INT,因此要在该列中获取 Total,您必须先转换为文本。

关于sql - 添加一个汇总行,其中包含每个子句的总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251832/

相关文章:

ruby-on-rails - Heroku 上的 Postgresql 数据库

postgresql - 在 PostgreSQL 中使用 COPY FROM 命令插入多个表

mysql - 获取数据子集到 qplot

mysql - 如何在mysql中选择符合特定条件的行对

sql - 将时间戳转换为整数问题

sql - 在临时表中添加新列

postgresql - 在Apache Airflow中实现Postgres Sql

postgresql - 正确的查询方式来检查凭证是否已经存在

sql - 在 Access 中连接多个列上的两个大表

sql - SSIS 包 - 由于错误 0xC0014062,无法加载包