는 :
입니다
SELECT
player,
COUNT(*) AS total_count
FROM (
SELECT
CASE WHEN x.is_in THEN t.player_in ELSE t.player_out END AS player
FROM mytable t
CROSS JOIN (SELECT TRUE AS is_in UNION ALL SELECT FALSE) x
) s
GROUP BY
player
;
, 원래 테이블의 모든 행은 본질적으로 파생 테이블의 is_in
열이 TRUE
또는 FALSE
인지 여부에 따라 행의 각 복사본은 player_in
또는 player_out
중 하나를 제공하여 단일 player
열을 형성합니다. 이 방법은 UNION 메서드 suggested by @Bohemian보다 성능이 좋을 수 있습니다. (물리적 인) 테이블을 한 번만 전달하기 때문에 (그러나 특정 상황에서이 접근 방식에 상당한 이점이 있는지 확인하기 위해 두 방법을 테스트하고 비교해야합니다.).
SELECT
player,
COUNT( is_in OR NULL) AS in_count, COUNT(NOT is_in OR NULL) AS out_count,
COUNT(*) AS total_count
FROM (
SELECT
x.is_in,
CASE WHEN x.is_in THEN t.player_in ELSE t.player_out END AS player
FROM mytable t
CROSS JOIN (SELECT TRUE AS is_in UNION ALL SELECT FALSE) x
) s
GROUP BY
player
;
당신이 볼 수 있듯이, 파생 테이블 : 당신이 위에서 언급 한 대답에 귀하의 의견 중 하나에 요청대로
는이 같은 내 원래의 제안을 확장 할 수, 및 카운트에서 계산하려면 이제 추가로 is_in
열을 자체적으로 반환하고 열은 플레이어가 몇 번이나 들어 왔는지 계산하기 위해 두 조건부 집계에 사용됩니다. (만약 여러분이 관심이 있다면, OR NULL
트릭은 here을 설명한다.)
또한 SUM(condition)
로 COUNT(condition OR NULL)
항목을 다시 작성할 수 있습니다. 그것은 확실히 두 표현을 단축 할 것이고, 일부는 또한 더 명확하고 더 우아한 카운트의 SUM
방법을 찾는다. 두 경우 모두 성능에 차이가 없으므로 취향에 맞는 방법을 선택하십시오.
두 번째 쿼리의 SQL Fiddle 데모는 here입니다.
+1 나는 그 사실을 알고 싶습니다. – ncm
'SELECT COUNT (player_in), (SELECT COUNT (player_out) from myTable GROUP BY player_out) AS player_out from myTable GROUP BY player_in' work? –
+1. 좋은 생각 이네. 나는 네가 똑똑하다고 생각해. – ncm