как считать без дубликатов?

#sql #fastreport

#sql #fastreport

Вопрос:

я получил приведенный ниже запрос, и я хочу посчитать EAMDATE, когда EAMATTNSTATUS= 7 или 8, как 0,5, И посчитать EAMDATE, когда EAMATTNSTATUS = 6, как единицу.


   SELECT EAMEMID,
           SUM(CASE WHEN EAMATTNSTATUS in (7) OR EAMATTNSTATUS in (8) THEN 1 ELSE 0 END) / 2   COUNT(DISTINCT CASE WHEN EAMATTNSTATUS in (6) THEN EAMDATE END) as ABSENTDAYS  
    FROM viewDAILYSUM  
    WHERE (EAMEMID = :EAMEMID) AND
          (EAMDATE between :FDate and :TDate)
    GROUP BY EAMEMID                                                                                                     
    ORDER BY EAMEMID
  

трудная часть для меня в том, что существует такая ситуация, когда один EAMDATE может иметь статус EAMATTNSTATUS = 7 или 8 И EAMATTNSTATUS = 6. Это означает, что он будет дублировать подсчет для этого EAMDATE дважды, потому что он имеет статус 2.

как я могу исправить дубликат??

я пытался использовать Distinct, но это не сработало…

есть идеи ??!

Спасибо

 SAMPLE DATA 
    EAMEID | EAMDATE | EAMATTNSTATUS| 
    ------ | --------| -------------|
    161    |20/7/2016| 6            | 
    161    |20/7/2016| 7            |   
    161    |21/7/2016| 6            |   
    161    |22/7/2016| 5            |   
    161    |23/7/2016| 8            |  
CURRENT OUTPUT

EAMEID | EAMDATE | ABSENTDAYS   |  
------ | --------| -------------|
161    |20/7/2016| 1            | 
161    |20/7/2016| 0.5          |   
161    |21/7/2016| 1            |   
161    |22/7/2016| 0            |   
161    |23/7/2016| 0.5          | 

WANTED RESULT 

EAMEID | EAMDATE | ABSENTDAYS   |  
------ | --------| -------------|
161    |20/7/2016| 0.5          |   
161    |21/7/2016| 1            |   
161    |22/7/2016| 0            |   
161    |23/7/2016| 0.5          | 
  

Комментарии:

1. Примерные данные и ожидаемый результат.. Похоже, для меня это сложный вопрос

2. Здравствуйте, я добавил необходимую информацию, жду вашего комментария, спасибо

Ответ №1:

Извините, это не ясно (для меня), что вам нужно. Например, логика, которую вам нужно применить, чтобы иметь

 EAMEID | EAMDATE | ABSENTDAYS   |  
------ | --------| -------------|
161    |20/7/2016| 0.5          |   
  

Начиная с

 EAMEID | EAMDATE | EAMATTNSTATUS| 
------ | --------| -------------|
161    |20/7/2016| 6            | 
161    |20/7/2016| 7            |  
  

Я имею в виду… почему ABSENTDAYS равен 0.5, а не 1? Какую логику вам нужно применить к запросу?

Комментарии:

1. когда сотрудник попадает под категорию 8 или 7, это означает, что в этот день у него один удар. и я хочу посчитать, что он отсутствует только полдня. где текущий вывод показывает, что он отсутствует в течение 1.5 на эту дату, что не логично … надеюсь, это поможет

2. Извините, не помогает. Я все еще не понимаю, какая логика нужна для вашего запроса. У вас есть 2 записи для одного и того же пользователя (161) и в тот же день (20/7/2016 ) с разными EAMATTNSTATUS 6 и 7. 6 = 1 (ДНИ ОТСУТСТВИЯ) и 7 = 0,5 (ДНИ ОТСУТСТВИЯ), но: какую логику запроса вам нужно применить, чтобы выбрать между 1 и 0,5, не ясно. Для дня 20/7/2016 и пользователя 161 как выбрать между 0,5 или 1, учитывая, что есть эти два значения?

Ответ №2:

Вы можете использовать свой запрос как вложенный запрос, а затем сгруппировать.

 SELECT EAMEMID, EAMDATE, MIN(ABSENTDAYS) MINABSENT FROM  (SELECT EAMEMID,EAMDATE,
       SUM(CASE WHEN EAMATTNSTATUS in (7) OR EAMATTNSTATUS in (8) THEN 1 ELSE 0 END) / 2   COUNT(DISTINCT CASE WHEN EAMATTNSTATUS in (6) THEN EAMDATE END) as ABSENTDAYS  
FROM viewDAILYSUM  
WHERE (EAMEMID = :EAMEMID) AND
      (EAMDATE between :FDate and :TDate)
GROUP BY EAMEMID                                                                                                 
ORDER BY EAMEMID)
GROUP BY EAMEMID, EAMDATE 
  

Комментарии:

1. Я изменил sql. Пожалуйста, теперь проверьте.