카운트 쿼리 질문입니다. 0 5 678

by 고래 [MySQL] [2020.11.19 10:26:16]


안녕하세요

MYSQL 쿼리관련 질문드립니다..

SELECT T.TenantNm, 
  (SELECT COUNT(TS.TsId)
   FROM tenantStudent TS
     LEFT JOIN studentresume SR ON SR.TsId = TS.TsId
   WHERE TS.DelYN = 'N' AND SR.DelYN = 'N' AND SR.SrType = 'E'
     AND (SR.StartDate <= DATE_FORMAT(CONCAT('2020', '11', '01'), '%Y-%m-%d 00:00:00')
       OR SR.StartDate <= DATE_FORMAT(LAST_DAY(DATE_FORMAT(CONCAT('2020', '11', '01'), '%Y-%m-%d')), '%Y-%m-%d 23:59:59'))
     AND (SR.EndDate >= DATE_FORMAT(CONCAT('2020', '11', '01'), '%Y-%m-%d 00:00:00')
       OR SR.EndDate >= DATE_FORMAT(LAST_DAY(DATE_FORMAT(CONCAT('2020', '11', '01'), '%Y-%m-%d')), '%Y-%m-%d 23:59:59'))
     AND TS.TenantId = T.TenantId
   GROUP BY TS.TsId) AS TotalStudents,
   (SELECT SUM(SA.SaAttend)
    FROM studentattendance SA
    WHERE SA.DelYN = 'N'
      AND SA.SaDate >= DATE_FORMAT(CONCAT('2020', '11', '01'), '%Y-%m-%d 00:00:00')
      AND SA.SaDate <=  DATE_FORMAT(LAST_DAY(DATE_FORMAT(CONCAT('2020', '11', '01'), '%Y-%m-%d')), '%Y-%m-%d 23:59:59')
      AND SA.TenantId = T.TenantId
    GROUP BY SA.TenantId) AS TotalAttendance
FROM tenant T
WHERE T.DelYN = 'N' AND T.TenantStatus = 'Y'
GROUP BY T.TenantId

이렇게 할시에

결과값은

TenantNm / TotalStudents / TotalAttendance

A / 4 / 8

B / 2 / 4

C / 0 / 0

D / 5 / 9

 

이런식으로 나와야하는데

 

A / NULL / NULL

B / NULL / NULL

C / NULL / NULL

D / NULL / NULL

 

로 나옵니다.. 선배님들 도와주세요

 
by 고래 [2020.11.19 10:28:37]

추가로 서브쿼리 사용한 이후는

TenantNm / TotalStudents / TotalA / TotalB 계속 붙을예정이라 이렇게 하였습니다..

 

by 마농 [2020.11.19 13:34:34]

1. null 이 나오는 이유는
- 조건을 만족하는 자료가 없어서 입니다.
- 데이터를 확인 해 보세요.
2. 쿼리에 군더더기가 많네요.
- 메인 쿼리 및 서브쿼리에 GROUP BY 가 불필요해 보입니다.
- OR 조건이 이상하게 사용되었습니다. 


by 고래 [2020.11.19 14:42:05]

네 감사합니다. 

1번 답변 - 데이터는 다시 확인해서 수정했습니다.

2번 답변 - 어떤 점이 잘못됐는지 조금 더 구체적으로 알려주실 수 있으신가요?


by 마농 [2020.11.19 17:05:25]

1. 메인 쿼리의 그룹바이
- TenantId 는 tenant 테이블의 PK 일 것으로 예상됩니다.
- 유일키 값으로 그룹핑 하는 것은 무의미 합니다.
2. 서브 쿼리의 그룹바이
- TenantId 에 해당하는 카운트를 구하는데 난데 없이 TS.TsId 로 그룹핑하네요? 그룹 항목이 이상하고요
- 2번 서브쿼리는 그래도 TenantId 로 그룹핑하긴 하네요.
- 하지만 굳이 그룹바이 안해도 됩니다.
3. OR 조건은 다음과 같이 변경해도 동일한 의미입니다.
- 변경전 : (sdt <= '20201101' OR sdt <= '20201130') AND (edt >= '20201101' OR edt >= '20201130')
- 변경후 : sdt <= '20201130' AND edt >= '20201101'


by 고래 [2020.11.19 17:24:37]

정말 감사드립니다 ^^ 마농님덕분에 해결했습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입