by 홍이 [SQL Query] MySQL SQL 쿼리 [2018.10.26 10:14:29]
안녕하세요.
게시글의 상태가 완료가 된 값을 COUNT하고 싶은데 게시글에 대하여 관련글이 있을때
COUNT를 어떻게 해야할지 막혀서 문의 드립니다.
테이블 데이터가 seqNo 하나에 manageNo가 여러개 있을수가 있는데 상태가 등록/완료/확인중 이렇게 있을때
완료가 된 값을 COUNT 하고싶습니다.
seqNo에 대하여 관련되어 있는 manageNo가 모두 완료로 상태가 되어 있어야 COUNT를 1로 하고 싶습니다.
seqNo | manageNo | state |
1 | 1 | 등록 |
2 | 1 | 완료 |
3 | 1 | 확인중 |
3 | 2 | 확인중 |
3 | 3 | 완료 |
6 | 1 | 등록 |
7 | 1 | 완료 |
7 | 2 | 확인중 |
7 | 3 | 등록 |
7 | 4 | 확인중 |
원하는 결과는
완료 건수 |
1건 |
입니다.
seqNo가 3, 7은 관련글이 모두 완료되지 않아 COUNT 되지 않도록 하고 싶습니다.
감사합니다.
WITH t AS ( SELECT 1 seqNo, 1 manageNo, '등록' state UNION ALL SELECT 2, 1, '완료' UNION ALL SELECT 3, 1, '확인중' UNION ALL SELECT 3, 2, '확인중' UNION ALL SELECT 3, 3, '완료' UNION ALL SELECT 6, 1, '등록' UNION ALL SELECT 7, 1, '완료' UNION ALL SELECT 7, 2, '확인중' UNION ALL SELECT 7, 3, '등록' UNION ALL SELECT 7, 4, '확인중' ) SELECT COUNT(*) complete_cnt FROM (SELECT seqNo FROM t GROUP BY seqNo HAVING COUNT(*) = COUNT(CASE WHEN state = '완료' THEN 1 END) -- HAVING MIN(state) = '완료' AND MAX(state) = '완료' -- HAVING COUNT(CASE WHEN state != '완료' THEN 1 END) = 0 -- HAVING MIN(CASE WHEN state = '완료' THEN 1 ELSE 0 END) = 1 ) a ;