ORACLE Group By&重复

时间:2014-09-02 09:21:18

标签: oracle group-by distinct

我来自MySQL背景,我遇到以下问题:

SELECT DISTINCT agenda.idagenda AS "ID_SERVICE", agenda.name AS "ID_SERVICE_NAME", specialities.id AS "ID_DEPARTMENT", specialities.name AS "ID_DEPARTMENT_NAME", 
                supervisor.clients_waiting AS "CWaiting",
                (CASE WHEN supervisor.clients_resent_waiting_area IS NULL THEN 0 ELSE supervisor.clients_resent_waiting_area END) AS "CWaiting_Resent_Area",
                supervisor.clients_attending AS "CAttending",
                supervisor.clients_attended  AS "CAttended",
                (SELECT MAX(ROUND((SYSDATE-core.supervisor_time_data.time_attending)*86400)) FROM dual) AS "MTA",
                (SELECT MAX(ROUND((SYSDATE-core.supervisor_time_data.time_waiting)*86400)) FROM dual) AS "MTE",
                (SELECT SUM(SYSDATE-supervisor_time_data.time_attending)*86400 FROM dual)/(SELECT supervisor.clients_attending FROM dual) AS "TMA", 
                (SELECT SUM(SYSDATE-supervisor_time_data.time_waiting)*86400 FROM dual)/(SELECT supervisor.clients_waiting FROM dual) AS "TME", 
                supervisor.tme_accumulated AS "TME_ACCUMULATED", 
                supervisor.tma_accumulated AS "TMA_ACCUMULATED", 
                (CASE WHEN agenda.alarm_cee IS NULL THEN 0 ELSE agenda.alarm_cee END) AS "ALARM_CEE",
                (CASE WHEN agenda.alarm_mte IS NULL THEN 0 ELSE agenda.alarm_mte END) AS "ALARM_MTE",
                (CASE WHEN agenda.alarm_mta IS NULL THEN 0 ELSE agenda.alarm_mta END) AS "ALARM_MTA",
                (CASE WHEN agenda.alarm_tme IS NULL THEN 0 ELSE agenda.alarm_tme END) AS "ALARM_TME"
                FROM CORE.supervisor 
                LEFT JOIN CORE.supervisor_time_data ON supervisor_time_data.id_service = supervisor.id_service 
                LEFT JOIN CORE.agenda ON supervisor.id_service = agenda.id 
                LEFT JOIN CORE.specialities ON agenda.idspeciality = specialities.id 

            WHERE supervisor.booked_or_sequential = 1

            GROUP BY agenda.idagenda, agenda.name, supervisor.id_service, specialities.id, specialities.name, supervisor.clients_waiting, supervisor.clients_resent_waiting_area, 
            supervisor.clients_attending, supervisor.clients_attended,
            supervisor_time_data.time_attending, supervisor_time_data.time_waiting, 
            supervisor.tme_accumulated, supervisor.tma_accumulated, agenda.alarm_cee, agenda.alarm_mte,agenda.alarm_mta,agenda.alarm_tme;

它应该返回两个记录,但它返回四个。 ID_SERIVE返回3个具有相同值的记录。

"ID_SERVICE"    "ID_SERVICE_NAME"   "ID_DEPARTMENT" "ID_DEPARTMENT_NAME"    "CWaiting"  "CWaiting_Resent_Area"  "CAttending"    "CAttended" "MTA"   "MTE"   "TMA"   "TME"   "TME_ACCUMULATED"   "TMA_ACCUMULATED"   "ALARM_CEE" "ALARM_MTE" "ALARM_MTA" "ALARM_TME"
"DR"    "DR"    1   "SECUENCIALES"  1   0   1   1   5504        5504        21  109 0   0   0   0
"DR"    "DR"    1   "SECUENCIALES"  1   0   1   1       1590            1590.000000000000000000000000000000000002   21  109 0   0   0   0
"DR"    "DR"    1   "SECUENCIALES"  1   0   1   1                   21  109 0   0   0   0
"TRAU"  "TRAU"  1   "SECUENCIALES"  1   0   0   0       1567        1567.000000000000000000000000000000000002   0   0   0   0   0   0

我做错了什么?

由于

1 个答案:

答案 0 :(得分:0)

您似乎在group by中包含了您感兴趣的所有列,而不是正确汇总;可能您已经通过反复试验达到了这一点,因为您已尝试解决未归类的列中的错误。您不需要在所有列子句中进行子选择。

未经测试,因为我们没有您的表格或原始数据,但看起来您想要类似的内容:

SELECT agenda.idagenda AS "ID_SERVICE",
  agenda.name AS "ID_SERVICE_NAME",
  specialities.id AS "ID_DEPARTMENT",
  specialities.name AS "ID_DEPARTMENT_NAME", 
  supervisor.clients_waiting AS "CWaiting",
  NVL(supervisor.clients_resent_waiting_area, 0) AS "CWaiting_Resent_Area",
  supervisor.clients_attending AS "CAttending",
  supervisor.clients_attended  AS "CAttended",
  MAX(ROUND((SYSDATE - supervisor_time_data.time_attending)*86400)) AS "MTA",
  MAX(ROUND((SYSDATE - supervisor_time_data.time_waiting)*86400)) AS "MTE",
  SUM(SYSDATE - supervisor_time_data.time_attending)*86400
    / supervisor.clients_attending AS "TMA", 
  SUM(SYSDATE - supervisor_time_data.time_waiting)*86400
    / supervisor.clients_waiting AS "TME", 
  supervisor.tme_accumulated AS "TME_ACCUMULATED", 
  supervisor.tma_accumulated AS "TMA_ACCUMULATED", 
  NVL(agenda.alarm_cee, 0) AS "ALARM_CEE",
  NVL(agenda.alarm_mte, 0) AS "ALARM_MTE",
  NVL(agenda.alarm_mta, 0) AS "ALARM_MTA",
  NVL(agenda.alarm_tme, 0) AS "ALARM_TME"
FROM CORE.supervisor 
LEFT JOIN CORE.supervisor_time_data
  ON supervisor_time_data.id_service = supervisor.id_service 
LEFT JOIN CORE.agenda ON supervisor.id_service = agenda.id 
LEFT JOIN CORE.specialities ON agenda.idspeciality = specialities.id 
WHERE supervisor.booked_or_sequential = 1
GROUP BY agenda.idagenda, agenda.name, supervisor.id_service, specialities.id,
  specialities.name, supervisor.clients_waiting,
  supervisor.clients_resent_waiting_area, supervisor.clients_attending,
  supervisor.clients_attended, supervisor.tme_accumulated,
  supervisor.tma_accumulated, agenda.alarm_cee,
  agenda.alarm_mte,agenda.alarm_mta,agenda.alarm_tme;

具体而言,supervisor_time_data.time_waitingsupervisor_time_data.time_attending不需要在group by中,因为它们在汇总时使用。

我已将case支票替换为nvl只是因为它更短;如果您愿意的话,情况很好。