4

数据库SQL 小提琴

需要查询:返回每个保险公司的 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 列?

4

3 回答 3

4

说明

您必须通过连接两个表中列上的记录来连接表InsuranceCompaniesPatient使用LEFT OUTER JOINcid ,并且还必须应用过滤器以仅选择2535岁之间的患者(包括那些边界值)。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
于 2012-05-01T17:33:42.653 回答
0

JOIN 怎么样?

SELECT I.cname, ISNULL(W.c,0) AS WomenCount, ISNULL(M.c,0) as MenCount
FROM InsuranceCompanies AS I
LEFT JOIN MenInAgeCount AS M ON M.cid = I.cid
LEFT JOIN WomenInAgeCount AS W ON W.cid = I.cid

LEFT JOIN此处以防 Men 或 Women 视图不包含 InsuranceCompanies 表中每一行的条目。ISNULL适用于 SQL Server,但您可以根据需要为 MySQL、Oracle 进行修改。

于 2012-05-01T17:30:24.580 回答
0

这应该会给你一些帮助-

select count(pid) as numPatients, cid, gender
from patient
group by cid, gender
于 2012-05-01T17:31:12.210 回答