如何计算另一个表中的数据
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 PATIENTNUM
、COUNT(...) 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。以上是关于如何计算另一个表中的数据的主要内容,如果未能解决你的问题,请参考以下文章