mysql - 对于按另一列分组的给定条件,如何获取两列的计数?

标签 mysql sql

数据库:SQL Fiddle

需要查询:返回每个保险公司的 25-35 岁女性和男性人数。

我的进步:

CREATE VIEW MenInAge AS
SELECT p.pname,p.pid,p.cid
FROM Patient p
WHERE p.gender = 'm' and p.age between 25 and 35;

CREATE VIEW WomenInAge AS
SELECT p.pname,p.pid,p.cid
FROM Patient p
WHERE p.gender = 'f' and p.age between 25 and 35;

CREATE VIEW MenInAgeCount AS
SELECT m.cid, COUNT(m.pid) as c
FROM MenInAge m
GROUP BY m.cid;

CREATE VIEW WomenInAgeCount AS
SELECT w.cid, COUNT(w.pid) as c
FROM WomenInAge w
GROUP BY w.cid;

如何为每个 InsuranceCompany.cid 显示 WomenInAgeCount.c 和 MenInAgeCount.c 列?

最佳答案

解释:

您必须使用 LEFT OUTER JOIN 连接表 InsuranceCompaniesPatient,方法是连接 cid 两个表中的列,并且还应用过滤器以仅选择年龄在 2535 之间的患者(包括那些边界值)。 CASE 语句仅检查患者是男性还是女性,并通过在值匹配时分配值 1 和在值不匹配时分配值 0 来计算两个不同的列。最后,您必须按 cname 对结果进行分组,以按保险公司名称获取计数。

关于 CASE 的解释:

在 CASE 表达式中,查询声明当性别字段值为 f 时,将值 1 分配给 female 列。值 1 是硬编码的,因为它意味着查询找到与 gender='f' 记录匹配的 1 行,这也代表 1 个人。您也可以声明 ELSE 0 但它是隐式的,因此没有必要指定它。此 CASE 表达式计算查询结果中的每条记录。最后,您将获得女性列包含 1 或 0 的所有行。当您对该列女性求和时,您将获得女性总数,男性列的逻辑相同。

合并:

COALESCE 将任何 NULL 值替换为第二个参数中的给定值(在本例中为零)。

Click here to view the demo in SQL Fiddle.

脚本:

SELECT              ic.cname
                ,   COALESCE(SUM(CASE WHEN gender = 'f' THEN 1 END), 0) female
                ,   COALESCE(SUM(CASE WHEN gender = 'm' THEN 1 END), 0) male 
FROM                InsuranceCompanies ic
LEFT OUTER JOIN     Patient p
ON                  p.cid = ic.cid
AND                 age BETWEEN 25 AND 35
GROUP BY            ic.cname;

输出:

CNAME      FEMALE MALE
---------- ------ ----
Clalit Inc    0    2
Harel Inc     2    0

没有合并:

Click here to view the demo in SQL Fiddle

脚本:

SELECT              ic.cname
                ,   SUM(CASE WHEN gender = 'f' THEN 1 END) female
                ,   SUM(CASE WHEN gender = 'm' THEN 1 END) male 
FROM                InsuranceCompanies ic
LEFT OUTER JOIN     Patient p
ON                  p.cid = ic.cid
AND                 age BETWEEN 25 AND 35
GROUP BY            ic.cname;

输出:

CNAME      FEMALE MALE
---------- ------ ----
Clalit Inc  NULL   2
Harel Inc     2   NULL

关于mysql - 对于按另一列分组的给定条件,如何获取两列的计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10401578/

相关文章:

c# - 插入大量数据的最佳选择

sql - Postgres : Returning first 3 characters of a JSON property

MYSQL Where on DateTime 错误结果

php - 将多个 foreach MySQL 插入语句与 PHP 数组数据合并为一个

mysql - 添加外键约束的问题

mysql - 快速刷新摘要数据以最大限度地减少停机时间

php - 在 MySQL 中搜索字符串 WHERE string LIKE string(括在括号中)

php - mysql 结果到数组写入 csv 文件?

mysql - 如何在 perl 脚本中使用 UTF8 连接到 MySQL?

sql - 根据条件选择多个Hibernate import.sql