Select returns 2 rows per GROUP BY account

2

The code below returns the number of dialed and the number of answered, but when adding the CASE to bring me the number of faults it separates the line from the answered ones from the line of the defaulters, this all on account of group by that has to be done with the IAC.TP_PRESENCA_FALTA column.

How do I prevent this from happening?

SELECT
    TRUNC(AC.DT_AGENDA)        AS DATA_AGENDA,
    ME.DS_MULTI_EMPRESA        AS EMPRESA,
    AC.CD_UNIDADE_ATENDIMENTO  AS CD_UNID_ATENDIMENTO,
    UA.DS_UNIDADE_ATENDIMENTO  AS UNIDADE_ATENDIMENTO,
    COUNT(IAC.NM_PACIENTE)     AS TOTAL_MARCADOS,
    COUNT(IAC.CD_ATENDIMENTO)  AS ATENDIDOS,
    (COUNT(IAC.CD_ATENDIMENTO) / COUNT(IAC.NM_PACIENTE) * 100) PERC_ATENDIDO,
    (CASE WHEN IAC.TP_PRESENCA_FALTA = 'F' THEN COUNT(IAC.TP_PRESENCA_FALTA) END) AS FALTA

FROM AGENDA_CENTRAL AC
    INNER JOIN IT_AGENDA_CENTRAL   IAC   ON AC.CD_AGENDA_CENTRAL      = IAC.CD_AGENDA_CENTRAL
    INNER JOIN UNIDADE_ATENDIMENTO UA    ON UA.CD_UNIDADE_ATENDIMENTO = AC.CD_UNIDADE_ATENDIMENTO
    INNER JOIN MULTI_EMPRESAS      ME    ON ME.CD_MULTI_EMPRESA       = AC.CD_MULTI_EMPRESA

WHERE IAC.NM_PACIENTE IS NOT NULL
AND ME.CD_MULTI_EMPRESA  = 2
AND AC.CD_AGENDA_CENTRAL = 12643

GROUP BY AC.CD_UNIDADE_ATENDIMENTO,
    UA.DS_UNIDADE_ATENDIMENTO,
    ME.DS_MULTI_EMPRESA,
    AC.DT_AGENDA,
    IAC.TP_PRESENCA_FALTA

Result:

MARCADOS    ATENDIDOS   PERC_ATENDIDO   FALTA
 9              9           100%          0
 4              0            0            4

Expected result:

MARCADOS    ATENDIDOS   PERC_ATENDIDO   FALTA
    13          9            69%          4
    
asked by anonymous 11.05.2018 / 15:36

1 answer

1

Answer, based on @Andrey's comment.

Because the subselect was able to return the expected result. Here is the corrected code below.

SELECT
    DATA_AGENDA,
    EMPRESA,
    CD_UNID_ATENDIMENTO,
    UNIDADE_ATENDIMENTO,
    TOTAL_MARCADOS,
    ATENDIDOS,
    TOTAL_MARCADOS - ATENDIDOS AS FALTA,
    ROUND(PERC_ATENDIDO,0) PERC_ATENDIDO


FROM (SELECT
      TRUNC(AC.DT_AGENDA)        AS DATA_AGENDA,
      ME.DS_MULTI_EMPRESA        AS EMPRESA,
      AC.CD_UNIDADE_ATENDIMENTO  AS CD_UNID_ATENDIMENTO,
      UA.DS_UNIDADE_ATENDIMENTO  AS UNIDADE_ATENDIMENTO,
      COUNT(IAC.NM_PACIENTE)     AS TOTAL_MARCADOS,
      COUNT(IAC.CD_ATENDIMENTO)  AS ATENDIDOS,
      (COUNT(IAC.CD_ATENDIMENTO) / COUNT(IAC.NM_PACIENTE) * 100) PERC_ATENDIDO
      ,(SELECT (CASE WHEN IT_AGENDA_CENTRAL.TP_PRESENCA_FALTA = 'F' THEN COUNT(IT_AGENDA_CENTRAL.TP_PRESENCA_FALTA) END) FALTA

       FROM IT_AGENDA_CENTRAL) FALTA



FROM AGENDA_CENTRAL AC
    INNER JOIN IT_AGENDA_CENTRAL   IAC   ON AC.CD_AGENDA_CENTRAL      = IAC.CD_AGENDA_CENTRAL
    INNER JOIN UNIDADE_ATENDIMENTO UA    ON UA.CD_UNIDADE_ATENDIMENTO = AC.CD_UNIDADE_ATENDIMENTO
    INNER JOIN MULTI_EMPRESAS      ME    ON ME.CD_MULTI_EMPRESA       = AC.CD_MULTI_EMPRESA

WHERE IAC.NM_PACIENTE IS NOT NULL
AND ME.CD_MULTI_EMPRESA  = 2
AND AC.CD_AGENDA_CENTRAL = 12643

Removed the IAC.TP_PRESENCA_FALTA from GROUP BY

GROUP BY AC.CD_UNIDADE_ATENDIMENTO,
    UA.DS_UNIDADE_ATENDIMENTO,
    ME.DS_MULTI_EMPRESA,
    AC.DT_AGENDA)
    
11.05.2018 / 16:30