数据库: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 连接表 InsuranceCompanies
和 Patient
,方法是连接 cid
两个表中的列,并且还应用过滤器以仅选择年龄在 25 和 35 之间的患者(包括那些边界值)。 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/