2016-10-12 3 views
0

Я получил следующий запрос, и я хочу подсчитать 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   | 
+0

Выборочные данные и ожидаемый результат .. Похоже каверзный вопрос мне –

+0

Здравствуйте, я добавил необходимую информацию, ожидая ваш комментарий ,, Thanks – Majed

ответ

0

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

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? Какую логику вам нужно применить к запросу?

+0

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

+0

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

0

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

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 
+0

Привет, спасибо. но его не работает ... – Majed

+0

Я изменил sql. Теперь Pls проверяет. –

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