2016-08-31 3 views
0

В следующей таблице мы подсчитали, сколько раз пациент не показывался для медицинского назначения (NOSHOW). Он основан на том, если они не показывались в течение текущего дня, тогда мы показываем их счет этого из прошлого. Как я могу получить также отдел, для которого они не показывались? У нас есть 6 разных медицинских отделений, поэтому менеджер хочет узнать, есть ли проблема только для стоматологов или для всех. Это поможет им, возможно, не заказать кого-то и т.д.Необходимость подсчета в подсчете

SELECT Distinct 
    Appt_DateTime j, 
    Patient_Name j, 
    Appt_Status j,  
    Appt_Sched_Department_ID j, 
    Appt_Sched_Department_Descr j, 
    Patient_id j, 
    Patient_number j, 
    Appt_NoShow_Date j, 
    ISNULL(P.NotShowCount,0) AS NotShowCount 

FROM 
    vwGenPatInfo vwGenPatInfo j 
    INNER JOIN vwGenPatApptInfo vwGenPatApptInfo ON vwGenPatInfo.Patient_ID=vwGenPatApptInfo.Patient_ID 
    LEFT JOIN (
     SELECT Patient_ID, COUNT(Appt_Status) AS NotShowCount 
     FROM (SELECT Appt_DateTime, Appt_Status, Appt_Sched_Department_ID, Appt_Sched_Department_Descr, Appt_NoShow_Date, Patient_ID 
      FROM vwGenPatapptInfo AS vwGenPatApptInfo 
      WHERE  (Appt_Status = 'N') AND (Appt_DateTime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), - 1))) AS L 
    GROUP BY 
     Patient_ID) AS P ON vwGenPatInfo.Patient_ID=P.Patient_ID 
    WHERE 
     vwGenPatApptInfo.Appt_Status='N' 
    ORDER BY 
     vwGenPatApptInfo.Appt_Sched_Department_ID, 
     vwGenPatApptInfo.Appt_DateTime 

данные в настоящее время, как это: последнее число является счетчиком предыдущих noshows. Итак, мы хотим разбить это, как Adult Medicine_NS 3, Dental_NS 9. Показатель datetime - это noshow с предыдущего дня. Звонок вызовет их перепланировать.

Patient_Name Appt_Sched_Departmen Appt_NoShow_Date Previous No Show Count 
8/31/2016 No Shows 8/30/2016 
Patient_number 
Sinca Blay Adult Medicine 8/30/2016 12:05:46PM 12 
Wiske Semns Adult Medicine 8/30/2016 5:25:32PM 4 
Rose Alhar Adult Medicine 8/30/2016 5:57:01PM 6 
+0

Вам нужно будет начать с запроса, который действительно действителен. Этот запрос, который вы опубликовали, теперь явно использует то, что вы используете, поскольку оно даже не близко к действительности. У вас есть каждый столбец с псевдонимом «j», который будет работать, но он почти бесполезен. Здесь отличное место для начала. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Посмотрите на '' GROUP BY GROUPING SETS' (https: // technet.microsoft.com/en-us/library/bb510427(v=sql.105).aspx), это позволяет вам агрегировать на нескольких уровнях в одном запросе. – xQbert

ответ

1

Вы можете использовать analytic, aggregate и ranking оконные функции для этого.

Вот непроверенный запрос, чтобы дать вам идею:

SELECT  Patient_ID, 
      Patient_Name, 
      Appt_Sched_Department_ID, 
      Appt_Sched_Department_Descr, 
      Appt_NoShow_Date_Today, 
      Appt_NoShow_Date_Prev, 
      NotShowCount 
FROM  (SELECT  app.Patient_ID, 
         pat.Patient_Name, 
         app.Appt_Sched_Department_ID, 
         app.Appt_Sched_Department_Descr, 
         app.Appt_DateTime AS Appt_NoShow_Date_Today, 
         LEAD(app.Appt_DateTime) 
          OVER (PARTITION BY app.Patient_ID 
            ORDER BY app.Appt_DateTime DESC) AS Appt_NoShow_Date_Prev, 
         COUNT(app.Appt_Status) 
          OVER (PARTITION BY app.Patient_ID) AS NotShowCount, 
         ROW_NUMBER() 
          OVER (PARTITION BY app.Patient_ID 
            ORDER BY app.Appt_DateTime DESC) AS rn 
      FROM  vwGenPatApptInfo app 
      INNER JOIN vwGenPatInfo pat 
        ON pat.Patient_ID = app.Patient_ID 
      WHERE  app.Appt_Status = 'N' 
      ) AS base 
WHERE  rn = 1 
AND   Appt_NoShow_Date_Today >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 
ORDER BY Appt_Sched_Department_ID, 
      Appt_NoShow_Date_Today 

Внутренний запрос получает все записи со статусом «N», но добавляет информацию:

  • Appt_NoShow_Date_Prev: значение Appt_DateTime следующую запись, если записи отсортированы по убыванию Appt_DateTime (для одного и того же пациента: это «окно»).
  • NotShowCount: Количество записей в этом окне.
  • rn: порядковый номер записи в этом окне, снова, когда записи сортируются по убыванию Appt_DateTime.

Внешний запрос только сохраняет записи с rn = 1, что означает: запись с самым последним Appt_DateTime на одного пациента. В качестве второго условия этот Appt_DateTime должен быть сегодня (после последней полуночи): это гарантирует, что мы будем перечислять только те пациенты, которые отсутствовали сегодня.

Смежные вопросы