说明:
您必须通过连接两个表中列上的记录来连接表InsuranceCompanies
并Patient
使用LEFT OUTER JOINcid
,并且还必须应用过滤器以仅选择25至35岁之间的患者(包括那些边界值)。CASE语句仅检查患者是男性还是女性,并通过在值匹配时分配值 1 和如果值不匹配时分配值 0 来计算两个不同的列。最后,您必须按 cname 对结果进行分组,以按保险公司名称获取计数。
案例说明:
在 CASE 表达式中,查询状态 WHEN 性别字段值为f将值 1 分配给女性列。值 1 是硬编码的,因为这意味着查询找到了与 gender='f' 记录匹配的 1 行,这也表示 1人。您也可以声明 ELSE 0,但它是隐含的,因此无需指定。此 CASE 表达式计算查询结果中的每条记录。最后,您将获得女性列包含 1 或 0 的所有行。当您将此列女性相加时,您将获得女性的总数,男性列的逻辑相同。
使用 COALESCE:
COALESCE
这里用第二个参数中的给定值替换任何 NULL 值(在这种情况下为零)。
单击此处查看 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
没有合并:
单击此处查看 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