【问题标题】:Join tables resulting only one row连接表只产生一行
【发布时间】:2015-02-14 16:13:37
【问题描述】:

我正在尝试加入以下两个表:

       Table Patient                   |        Table incident
patient.id   patient.birthdate         |  incident.patientid       serviceid
1                  1/1/2000            |       1                        8
2                  1/1/1990            |       1                        8
3                  1/1/2005            |       2                        10
4                  1/1/1980            |       3                        11
5                  1/1/2000            |       3                        11
6                  1/1/1990            |       3                        11
7                  1/1/1980            |       6                        23
8                  1/1/2000            |       7                        8

为了对按 serviceid 分组的所有患者进行年龄分离。

SELECT serviceid,
        SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25 ) BETWEEN 0 AND 15 THEN 1 ELSE 0 END) AS [Under 15],
        SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25 ) BETWEEN 16 AND 18 THEN 1 ELSE 0 END) AS [16-18],
        SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25 ) BETWEEN 19 AND 23 THEN 1 ELSE 0 END) AS [19-23],
        SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25 ) BETWEEN 24 AND 30 THEN 1 ELSE 0 END) AS [24-30],
        SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25 ) BETWEEN 31 AND 40 THEN 1 ELSE 0 END) AS [31-40],
        SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25 ) BETWEEN 41 AND 50 THEN 1 ELSE 0 END) AS [41-50],
        SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25 ) BETWEEN 51 AND 65 THEN 1 ELSE 0 END) AS [51-65],
        SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25 ) > 65 THEN 1 ELSE 0 END) AS [>65]

from patient
inner join incident
on patient.id = incident.patientConcerned
group by serviceid

但我在上面尝试的是计算所有患者的所有事件的年龄,这意味着我没有计算不同的患者。 (例如,我将患者 1 计数两次,将患者 3 计数三次)

所以我想加入这两个表,但只有一行。

我该怎么做?

【问题讨论】:

  • 为什么需要加入表格?只是为了知道一个病人有一个或多个事件?如果是这种情况,请将条件移至 WHERE 子句(EXISTS...)。
  • 任何事件都可以做到这一点。我不介意,他们都有我想要的信息
  • 你用的是什么数据库? mysql?甲骨文?

标签: sql join


【解决方案1】:

使用count(distinct) 代替sum()。这是一个例子:

SELECT serviceid,
       COUNT(DISTINCT CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25 ) BETWEEN 0 AND 15
                           THEN Patient.Id 
                      END) AS [Under 15],
       . . .

【讨论】:

    【解决方案2】:

    使用Distinct 运算符。您的查询应如下所示:

       SELECT Distinct a.id, a.birthdate ,b.patient from
       patient a inner join incident b ON a.serviceid=b.serviceid
    

    【讨论】:

    • 我希望对查询有更多帮助。因为我像你说的那样加入了表格,但我没有更好的结果。谢谢。
    【解决方案3】:

    group by patient.patient_id代替group by serviceid

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 2014-07-10
      • 2021-01-05
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      相关资源
      最近更新 更多