본문 바로가기

computer/sql

하나의 테이블에서 0값을 포함해 count 하기

하나의 테이블에서 0값을 포함해 count 하기

프로젝트 중 웹에 올리기 위해 db에서 쿼리를 날리던 중 해결이 안되던 부분이 있어
Stackoverflow에 질문을 올려 도움받았다.

 

[sql count(including null) from table where two conditions]의 제목으로 질문했다.

 

team_summary와 team_stats 테이블에 tName과 W // Period, tName, win_lose의 컬럼이 있는데,
각 팀의 win_lose가 1인 값( 승리한 경기)를 합하려는 sql이다.
밑의 query에 대한 결과는 0을 포함하지 않는다.

 team_summary            team_stats 
 tName W                 Period tName win_lose 
 AUT   null              1      AUT   1 
 CAN   null              2      AUT   1 
 DEN   null              3      AUT   1 
 FIN   null              Total  AUT   1 
 ...                     1      CAN   0                         
                         2      CAN   0                         
                         ...
select tName, count(*) from team_stats  where Period='Total' and (win_lose) = 1 group by tName; 

이에 대한 답으로는

 update team_summary ts left join        
 	(select tName, count(*) as wins         
    from team_stats          
    where Period = 'Total' and (win_lose) = 1          
    group by tName        
    ) t        
    on ts.tName = t.tName     
    set ts.W= coalesce(t.wins, 0);

Stackoverflow에서 다른 검색에서도 left join을 사용하라고 했었지만 이해가 부족했었는데,
이 답을 보고 공부하니 이해가 된다.
coalesce는 처음 보는 구문인데, MS docs에 의하면
'인수를 순서대로 평가하고 처음으로 null이 아닌 첫번째 식의 현재 값을 반환합니다.'라고 한다.

documentation을 사실 제대로 이해못했지만, 제대로 공부하는 것의 중요함을 느꼈다는데에서 이율배반적인 모습이...