代码之家  ›  专栏  ›  技术社区  ›  Abdullah

如何像主查询一样按子查询分组?

  •  0
  • Abdullah  · 技术社区  · 8 月前

    如何像主查询一样应用逐子查询分组?

    这是查询:

    select a.clinic_no , 
    b.CLINIC_DESC_A , 
    a.doctor_no , 
    c.STAFF_NATIVE_NAME , 
    count(DISCHARGE_FROM_CLINIC) , 
    (select count(patient_no) from trng.opd_visits_history WHERE event_date BETWEEN 20240815 and 20240822) as "Total"
    from trng.opd_visits_history a , trng.hospital_clinics b  , trng.hospital_staff c 
    WHERE event_date BETWEEN 20240815 and 20240822
     and a.CLINIC_NO = b.CLINIC_NO
    and a.DOCTOR_NO = c.STAFF_NO 
    and b.DOCTOR_NO = c.STAFF_NO
    and a.HOSPITAL_NO = 720022
    and b.HOSPITAL_NO = 720022
    and c.HOSPITAL_NO = 720022  
    AND a.DISCHARGE_FROM_CLINIC = 1
    group by a.clinic_no , a.doctor_no , b.CLINIC_DESC_A , c.STAFF_NATIVE_NAME
    

    输出如下:

    clinic no       doctor no            discharge from clinic    total 
       10               22                         5                1230
       12               15                         4                1230 
       16               19                         7                1230
       20               13                         2                1230 
    

    我需要按子查询分组,如下所示:

    select count(patient_no) from trng.opd_visits_history WHERE event_date BETWEEN 20240815 and 20240822 group by clinic_no , doctor_no
    

    当我在内部使用group-by和子查询时,它会显示错误

    ORA-01427 single row subquery returns more than one row 
    
    1 回复  |  直到 8 月前
        1
  •  1
  •   Littlefoot    8 月前

    您正试图使用相关子查询,但是-您没有将其表之间的任何相关性应用于外部表。它 必须 只返回一行(值),但是-当您放入 group by 子句-它导致返回多行,并出现错误。

    这样的事情可能会做(我也 JOIN ed表上的公共列和let WHERE 子句以筛选结果行):

      SELECT a.clinic_no,
             b.clinic_desc_a,
             a.doctor_no,
             c.staff_native_name,
             COUNT (discharge_from_clinic),
             (SELECT COUNT (patient_no)
                FROM trng.opd_visits_history h
               WHERE     h.clinic_no = a.clinic_no                            --> this
                     AND h.doctor_no = a.doctor_no                            --> this
                     AND event_date BETWEEN 20240815 AND 20240822) AS "Total"
        FROM trng.opd_visits_history a
             JOIN trng.hospital_clinics b
                ON     a.clinic_no = b.clinic_no
                   AND a.hospital_no = b.hospital_no
             JOIN trng.hospital_staff c
                ON     a.doctor_no = c.staff_no
                   AND b.doctor_no = c.staff_no
                   AND c.hospital_no = a.hospital_no
       WHERE     event_date BETWEEN 20240815 AND 20240822
             AND a.hospital_no = 720022
             AND a.discharge_from_clinic = 1
    GROUP BY a.clinic_no,
             a.doctor_no,
             b.clinic_desc_a,
             c.staff_native_name