如何计算另一个表中的数据

Posted

技术标签:

【中文标题】如何计算另一个表中的数据【英文标题】:How to count data from another table 【发布时间】:2014-10-18 10:16:37 【问题描述】:

我的患者表有患者编号、患者姓名 和有 patientnum、insurancecode 的 insurance_cover 表

我需要显示有保险和无保险的患者,患者编号和保险总数, 如果不使用 join,我将如何做到这一点?

SELECT 'WITH INSURANCE' AS '',PATIENTNUM, PATIENTSURNAME
from PATIENT where PATIENTNUM 
IN(select PATIENTNUM from INSURANCE_COVER) 

UNION

SELECT 'WITHOUT INSURANCE' AS '',PATIENTNUM, PATIENTSURNAME
from PATIENT where PATIENTNUM 
NOT IN( select PATIENTNUM from INSURANCE_COVER)

此代码显示有保险和无保险的数据。 但是我不知道如何计算有保险的患者的保险。

我使用 NOT IN 对吗? 你能帮帮我吗?

【问题讨论】:

您是否需要有关有/没有保险的患者人数的汇总信息? 是的..我需要它 您应该添加另一个UNION,并在SELECT 后面包含COUNT() 并使其看起来像:WITH INSURANCE AS ''TOTAL AS PATIENTNUMCOUNT(...) AS PATIENTSURNAME 我应该有 3 个 UNION 吗? 一种方法是使用 UNION,这样您就可以在查询生成的一个表中获得详细和汇总的结果。您还可以添加一个包含 ID 的“假”列,例如 1、2、3、4,然后按它排序,以按所需顺序获取您的 SELECT 输出。 【参考方案1】:
SELECT 
    'WITH INSURANCE' AS '',
    PATIENTNUM, 
    PATIENTSURNAME,
    (SELECT COUNT(*) FROM PATIENT tmp WHERE PATIENTNUM IN(select PATIENTNUM from INSURANCE_COVER) AND tmp.PATIENTNUM = p.PATIENTNUM) AS INSURANCES
FROM
    PATIENT p
WHERE 
    PATIENTNUM IN(select PATIENTNUM from INSURANCE_COVER) 

UNION

SELECT 
    'WITHOUT INSURANCE' AS '',
    PATIENTNUM, 
    PATIENTSURNAME,
    0 AS INSURANCES
FROM
    PATIENT 
WHERE
    PATIENTNUM NOT IN( select PATIENTNUM from INSURANCE_COVER)

【讨论】:

这应该使用 UNION ALL 并且使用 EXISTS 或 NOT EXISTS 可能更有效 这只是添加到已经由它的所有者编写的代码中。既然他发布了 UNION,他应该更清楚自己需要什么,我不想惹麻烦。我们不知道子查询结果的大小,所以我不会走那么远并开始用 EXISTS 替换 IN,因为我们没有完整的案例。 谢谢,我明白了。值得注意的是,UNION 成本更高,特别是如果它可能在这里是多余的。同样,我发现 IN(...) 经常被过度使用,因为它不能很好地扩展,并且 EXISTS 在一开始就被写入这种需要的语言中;我看不出有什么理由不提。 很高兴你提到它 - OP 可以尝试并查看哪个选项更适合他的计划 :) 你是对的 - IN 子句几乎一直在使用,但是 SO 社区似乎在很多场合都在建议人们使用 EXISTS。

以上是关于如何计算另一个表中的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用另一个表中的数据创建计算列

如果任何列与另一个表中的匹配行不同,如何插入行

SQL 显示一张表中的数据并计算另一张表中的结果

如何创建一个脚本来合并另一个表中的几个表?

根据 Access DB 中另一个表中的多条记录计算字段的值

如何根据oracle中另一个表中的值更新一个表中的字段[重复]