2017-12-23 2 views
1

합류와 나는 두 개의 테이블이 있습니다 1. EMPLOYEE_DATA 및SQL 그룹으로 + 집계 기능

등의 열
EMP_ID MANAGER_ID 
9999  2222 
8888  2222 
7777  2222 

또 다른 테이블은 다음과 같습니다 2 EMPLOYEE_RECORDS : 내가 원하는

EMP_ID MANAGER_ID NO_OF_SWIPEINS ATTENDACE_DATE 
9999 2222   1    23-DEC-2017 
7777 2222   1    23-DEC-2017 
9999 2222   1    23-DEC-2017 
9999 2222   1    23-DEC-2017 

아래 형식의 데이터 :

EMP_ID  MANAGER_ID  TODAY_SWIPEINS 
9999   2222     3 
8888   2222     0 
7777   2222     1 

아래 쿼리를 시도했습니다.

SELECT edata.EMP_ID, sum(rec.NO_OF_SWIPEINS) as TODAY_SWIPEINS,edata.MANAGER_ID FROM EMPLOYEE_RECORDS rec 
right JOIN EMPLOYEE_DATA edata 
ON edata.MANAGER_ID = rec.MANAGER_ID 
and rec.MANAGER_ID='2222' and trunc(rec.ATTENDANCE_DATE)='23-DEC-2017' 
group by edata.EMP_ID ,edata.MANAGER_ID; 

그러나 결과입니다 점점 ​​:

EMP_ID TODAY_SWIPEINS  MANAGER_ID 
8888   4    2222 
7777   4    2222 
9999   4    2222 

누군가가 내가 잘못 뭐하는 거지 나를 인도 해주십시오.

+0

, 날짜 컬럼과 비교를하는 동안 TO_DATE를 사용하는 것이 바람직하다하지만 내가 표 1 – rumit

+0

당신이 할 수있는에있는 표 2에서 그 기록을 가지고 있겠지 t는 EMPLOYEE_RECORDS에 존재하지 않기 때문에 8888을 가짐 –

답변

0

MANAGER_ID에만 가입하고 EMP_ID에 가입하지 않았습니다. 아래의 향상된 쿼리를 확인하십시오.

SELECT edata.EMP_ID, edata.MANAGER_ID, sum(rec.NO_OF_SWIPEINS) as TODAY_SWIPEINS 
FROM 
EMPLOYEE_RECORDS rec right JOIN EMPLOYEE_DATA edata 
ON edata.MANAGER_ID = rec.MANAGER_ID and edata.EMP_ID = rec.EMP_ID 
and rec.MANAGER_ID='2222' and trunc(rec.ATTENDANCE_DATE)='23-DEC-2017' 
group by edata.EMP_ID ,edata.MANAGER_ID; 
1
select EMP_ID,MANAGER_ID sum(NO_OF_SWIPEINS) as TODAY_SWIPEINS from EMPLOYEE_RECORDS group by EMP_ID; 

EMPLOYEE_RECORDS가 조작하는 모든 데이터를 포함대로 두 개의 테이블을 조인 할 필요가 없습니다. 이제 Emp_ID 8888 에 대한 조항이 없으므로 8888에 대한 최종 쿼리는 표시되지 않습니다.이 경우 이 필요합니다. 따라서 EMPLOYEE_RECORDS 테이블은 위에서 설명한대로 정확한 결과를 얻으려면 순서로 표시되어야합니다.

EMP_ID MANAGER_ID NO_OF_SWIPEINS ATTENDACE_DATE 
9999 2222   1    23-DEC-2017 
7777 2222   1    23-DEC-2017 
9999 2222   1    23-DEC-2017 
9999 2222   1    23-DEC-2017 
8888 2222   0    23-DEC-2017 
1

당신이 employee_data에서 데이터를 선택하고 테이블 2.

확인이 가입해야합니다 :

SELECT ED.MANAGER_ID, ED.EMP_ID, COUNT(NO_OF_SWIPEINS), IFNULL(ATTENDACE_DATE, '23-DEC-2017') as ATTENDACE_DATE FROM EMPLOYEE_DATA ED 
LEFT JOIN EMPLOYEE_RECORDS ER 
ON ER.EMP_ID = ED.EMP_ID AND ATTENDACE_DATE = '23-DEC-2017' 
WHERE ED.MANAGER_ID = 222 
GROUP BY ED.MANAGER_ID, ED.EMP_ID; 

here is : 여기 slqfiddle

+0

검색어가 어떻게 든 좋지만 '23 -DEC-2017 '데이터를 필터링하지 않는 이유는 무엇입니까?나에게 당신의 대답은 정확할 것 같다. 왜냐하면 모든 데이터가 똑같은'ATTENDANCE_DATE'을 가지고 있기 때문이다. 그렇지 않다면 당신의 대답은 위증 될 것이다. – cdaiga

+1

@cdaiga 당신 말이 맞습니다. 내 원본 테이블은'employee_data'입니다. 내 대답이 업데이트되었습니다. – Badiparmagi

+0

좋지만 쿼리가 더 좋을 수 있습니다. attendance_date를 현재 날짜로 설정하여 매일 쿼리를 실행하는 날짜를 반복하지 않아도됩니다. 아래 내 대답을 확인하지만 당신의 투표가 정확할 정도로 정확합니다. 즐거운 잔치! – cdaiga

0

무엇을 수행하는 쿼리입니다 원하는 경우 ATTENDANCE_DATE은 현재 날짜로 설정됩니다. 여기

SELECT B.EMP_ID, B.MANAGER_ID, COUNT(A.NO_OF_SWIPEINS) TODAY_SWIPEINS FROM 
(SELECT * FROM EMPLOYEE_RECORDS WHERE ATTENDACE_DATE=DATE_FORMAT(NOW(),'%d-%b-%Y')) A 
RIGHT JOIN EMPLOYEE_DATA B 
ON A.EMP_ID=B.EMP_ID 
GROUP BY B.EMP_ID, B.MANAGER_ID; 

는 위의 쿼리의 SQL 바이올린 Demo입니다.

0

가까운 사이 였지만 관리자 ID로 가입 한 이유는 무엇입니까? SUM을 계산하는 동안 NULL 처리가 필요했습니다. 또한, 'attendance_date

SELECT edata.emp_id, 
     edata.manager_id, 
     SUM(CASE 
      WHEN rec.no_of_swipeins IS NULL THEN 0 
      ELSE rec.no_of_swipeins 
      END) AS TODAY_SWIPEINS 
FROM employee_records rec 
     RIGHT JOIN employee_data edata 
       ON edata.emp_id = rec.emp_id 
        AND rec.manager_id = '2222' 
        AND TRUNC(rec.attendance_date) = 
         To_date('23-DEC-2017', 'DD-MON-YYYY' 
        ) 
GROUP BY edata.emp_id, 
      edata.manager_id; 

DEMO

0
SELECT edata.EMP_ID, nvl(sum(rec.NO_OF_SWIPEINS), 0) as TODAY_SWIPEINS,edata.MGR_ID 
FROM EMPONE edata left JOIN MGRONE rec 
ON edata.EMP_ID = rec.EMP_ID 
group by edata.EMP_ID ,edata.MGR_ID 
+0

이 코드 단편은 질문을 해결할 수 있지만 [설명 포함] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-base- answers)은 고객의 품질을 향상시키는 데 정말로 도움이됩니다. 게시하다. 앞으로 독자의 질문에 답하고 있으며 코드 제안의 이유를 알지 못할 수도 있습니다. –