【问题标题】:SQL: Joining on a group functionSQL:加入组功能
【发布时间】:2017-03-23 17:30:59
【问题描述】:

我的桌子是:

表 1

Uid、hospital_nr、department_nr、diagnosis_nr、case_amount

我的查询: 我想知道,对于每家医院,哪个科室的三个特定诊断病例最多。

要找出这些诊断的每个部门的病例总数,我使用:

SELECT hospital_nr, department_nr, sum(case_amount) AS cases 
FROM Table_1 
WHERE diagnosis_nr = 1 OR diagnosis_nr = 3 OR diagnosis_nr = 4
GROUP BY hospital_nr, department_nr;

要找出一个部门对各个医院的最大病例数,我使用:

SELECT b.hospital_nr, max(a.sum_of_cases) AS max_sum_of_cases
FROM hdiag_data2014 AS b,
(SELECT Hospital_nr, department_nr, sum(case_amount) AS sum_of_cases 
FROM Table_1 
WHERE diagnosis_nr = 1 OR diagnosis_nr = 3 OR diagnosis_nr = 4
GROUP BY hospital_nr, department_nr) AS a
WHERE diagnosis_nr = 1 OR diagnosis_nr = 3 OR diagnosis_nr = 4
AND b.hospital_nr = a.hospital_nr 
GROUP BY b.hospital_nr;

现在我想在一个 INNER JOIN 中加入这两个表并尝试了这个:

SELECT c.hospital_nr, c.department_nr, sum(case_amount) AS cases 
FROM Table_1 AS c
INNER JOIN
    (SELECT b.hospital_nr max(a.sum_of_cases) AS max_sum_of_cases
    FROM Table_1 AS b,
        (SELECT hospital_nr, department_nr, sum(case_amount) AS sum_of_cases
        FROM Table_1 
        WHERE diagnosis_nr = 1 OR diagnosis_nr = 3 OR diagnosis_nr = 4
    GROUP BY hospital_nr, department_nr) AS a
    WHERE b.diagnosis_nr = 1 OR b.diagnosis_nr = 3 OR b.diagnosis_nr = 4
    AND b.hospital_nr = a.hospital_nr 
    GROUP BY b.hospital_nr) AS b 
ON c.cases = b.max_sum_of_cases
WHERE c.diagnosis_nr = 1 OR c.diagnosis_nr = 3 OR c.diagnosis_nr = 4
GROUP BY c.hospital_nr;

这个脚本不允许我通过这个 ON 加入,因为它说它不能将“案例”识别为列。这是为什么?我该如何改进它? 我回答“口头查询”的第一条路径是通过 HAVING 子句工作,但这也不成功,因为它不允许我按案件数量最多的部门进行过滤。我忽略了这条替代路径中的某些内容吗?

【问题讨论】:

    标签: mysql sql join sum max


    【解决方案1】:

    我建议使用substring_index()/group_concat() 技巧:

    SELECT hospital_nr,
           SUBSTRING_INDEX(GROUP_CONCAT(department_nr ORDER BY cases DESC), ',', 1) as max_department_nr
    FROM (SELECT hospital_nr, department_nr, sum(case_amount) AS cases 
          FROM Table_1 
          WHERE diagnosis_nr in (1, 3, 4)
          GROUP BY hospital_nr, department_nr
         ) hd
    GROUP BY hospital_nr;
    

    还有其他方法,但是这种方法一般是 MySQL 中最简单的。

    注意:这里假设 department_nr 不包含逗号。

    【讨论】:

    • 谢谢! 这解决了我的问题,是一种非常流畅且非常快速的数据处理方式。我以前从未使用过这种方法,但现在肯定会研究它。
    【解决方案2】:

    您可以在 WHERE 子句中使用带有LIMIT 1 的有序相关子查询来过滤出department_nr 和最大的case_amount

    SELECT DISTICT hospital_nr, department_nr
    FROM Table_1 t1
    WHERE department_nr = (
        SELECT department_nr 
        FROM Table_1 t2
        WHERE t2.hospital_nr = t1.hospital_nr
          AND t2.diagnosis_nr IN (1, 3, 4)
        ORDER BY sum(case_amount) DESC
        LIMIT 1
    )
    

    如果您还需要总和,则需要再次计算:

    SELECT hospital_nr, department_nr, sum(case_amount) AS cases
    FROM Table_1 t1
    WHERE department_nr = (
        SELECT department_nr 
        FROM Table_1 t2
        WHERE t2.hospital_nr = t1.hospital_nr
          AND t2.diagnosis_nr IN (1, 3, 4)
        ORDER BY sum(case_amount) DESC
        LIMIT 1
    )
    GROUP BY hospital_nr, department_nr
    

    注意:如果两个部门的总和相同,则查询将只“选择”一个。如果您想定义在这种情况下选择哪一个,您应该在 ORDER BY 子句中添加一列(例如department_id)。

    【讨论】:

      【解决方案3】:

      我认为您缺少别名“c”。在加入。其他一些别名也丢失了,所以我不确定他们应该从哪个表中提取。

      SELECT c.hospital_nr, c.department_nr, c.cases 
      FROM (SELECT hospital_nr, department_nr, sum(case_amount) AS cases
              FROM Table_1 
              WHERE diagnosis_nr in (1, 3, 4)
          GROUP BY hospital_nr, department_nr) AS c
      INNER JOIN
          ((SELECT b.hospital_nr, max(a.sum_of_cases) AS max_sum_of_cases
          FROM hdiag_data2014) AS b,
              (SELECT hospital_nr, department_nr, sum(case_amount) AS sum_of_cases
              FROM Table_1 
              WHERE diagnosis_nr in (1, 3, 4)
          GROUP BY hospital_nr, department_nr) AS a
          WHERE b.diagnosis_nr in (1, 3, 4)
          AND b.hospital_nr = a.hospital_nr 
          GROUP BY b.hospital_nr) AS b 
      ON c.cases = b.max_sum_of_cases);
      

      【讨论】:

      • 感谢您的回复!我已经更正了别名。可悲的是c。加入似乎并没有解决我的问题,因为它仍然无法识别该列。
      • @Lulilu.d 案例在 Table_1 中,还是您尝试加入您在选择中调用的 sum(case_amount)?如果是这样,这就是它不起作用的原因。您需要加入已经在 Table_1 中找到的列。
      • 谢谢! 这解释了我的问题。然而,如果我加入不同的列,结果不会给我病例最多的部门编号,但总是给我列表中的第一个部门编号。但是我的问题已经被另一个回答者substring_index()/group_concat() 解决了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多