0

我正在尝试获取我拥有的 2 张桌子(患者和医生)的邮政编码和该邮政编码的呼叫次数。我通过计算邮政编码来获得#of 呼叫,例如,如果有 5 名患者的邮政编码为 79555,那么计数将为 5。如果患者表有 3 人使用该邮政编码,而医生表有 4 人,它应该返回邮政编码和 7。我尝试了下面的联合。乍一看它看起来像我想要的,但我想总结重复的邮政编码,我可以在联合中使用 sum 函数吗?还是我必须创建一个联接?

SELECT zip_code, COUNT(zip_code) AS Num_Patient_Calls FROM patients GROUP BY zip_code
UNION ALL
SELECT zip_code, COUNT(zip_code) AS Num_Physician_Calls FROM physicians GROUP BY zip_code

编辑:解决方案 我使用 Gordon 和 dweiss 的响应来生成这个 SQL 代码。它做我想要的,即从不相关的表中获取两个可能具有或不具有相同值的字段,计算每个表中具有该值的记录数,然后将两个表的结果相加。示例:患者表中邮政编码 99709 的 6 个实例,医师表中的 1 个实例,显示的值为 99709 - 7。

SELECT zip_code, SUM(Patient_Calls) FROM (
    SELECT zip_code, COUNT(zip_code) AS Patient_Calls FROM patients GROUP BY zip_code
    UNION ALL
    SELECT zip_code, COUNT(zip_code) AS Physician_Calls FROM physicians GROUP BY zip_code
) AS new_table
GROUP BY zip_code ORDER BY `new_table`.`zip_code` 
4

2 回答 2

3

由于这些是不相关的表,因此您希望使用UNION. 此外,COUNTSUM是不同的功能,在这种情况下,您正在寻找COUNT. SUM 会将所有值相加,而COUNT会给您在 a 中找到该行的次数GROUP。这样的事情怎么样?

SELECT zip_code,COUNT(*) FROM (
SELECT zip_code AS Num_Patient_Calls FROM patients
UNION ALL
SELECT zip_code AS Num_Physician_Calls FROM physicians
) AS new_table
GROUP BY zip_code
于 2012-05-02T17:46:23.497 回答
1

为了回答您的问题,您需要 aUNION ALLFULL OUTER JOIN,因为您的邮政编码可能只有一种呼叫类型。

我会这样构建结果:

select zip_code, sum(Patient_Call) as Num_Patient_Calls,
       sum(Physician_Call) as Num_Physician_Calls,
       sum(Patient_Call + Physician_Call) as Num_Calls
from 
(
  (SELECT zip_code, 1 AS Patient_Call, 0 as Physician_Call
   FROM patients
  )
  UNION ALL
  (SELECT zip_code, 0 AS Patient_Call, 1 as Physician_Call
   FROM physicians
  )
) calls
GROUP BY zip_code

如果您多次运行此查询,您可以尝试在每个子查询中进行聚合,看看是否更快(例如,如果 zip_code 上有索引,那么它可能会更快)。

于 2012-05-02T18:02:10.160 回答