#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. Пожалуйста, теперь проверьте.