2016-07-06 2 views
1

사용자가 다른 회사에서 로그인하는 시스템이 있습니다. 활성 사용자의 수와 각 회사의 총 사용자 수를 비교하는 쿼리를 실행하려고합니다.그룹을 사용한 조건부 집계 쿼리

Users 테이블 :

userID, companyID, lastLogin

원하는 출력 :

companyID, totalCompanyUsers, numUsersWhoLoggedInWithinLastMonthFromCompany

쿼리 시도 :

SELECT companyID, COUNT(userID) AS `numUsersWhoLoggedInWithinLastMonth` 
FROM Users 
WHERE IFNULL(TIMESTAMPDIFF(MONTH, lastLogin, NOW()),- 1) = 1 
GROUP BY companyID; 
,536,

두 개의 집계 함수를 갖는 방법을 알아 내기 힘듭니다. 하나는 조건문입니다.

+0

열의 이름뿐 아니라 샘플 데이터와 원하는 결과를 추가하십시오. – Blank

+0

완벽하게 좋은 질문입니다. 시도가 이루어 졌으므로 열 이름과 시도한 내용을 기반으로 필요한 것을 시각화하는 것이 쉽습니다. 모든 질문에 샘플 데이터가 필요한 것은 아닙니다. – mjsqu

답변

1

당신은, 당신은 아주 가까이 수행 할 조건부 집계 집계 함수 내부의 조건을 둘 필요가있어 :

SELECT 
companyID, 
COUNT(userID) AS `totalCompanyUsers`, 
SUM(CASE 
    WHEN 
    TIMESTAMPDIFF(MONTH, lastLogin, NOW()) < 1 THEN 1 
    ELSE 0 
END 
) AS `numUsersWhoLoggedInWithinLastMonth` 
FROM Users 
GROUP BY companyID; 

을 결과는 여전히 companyID로 그룹화되어 있습니다,하지만 두 번째 집계 함수는 사용자가 지난 달 내에 로그인했는지 여부에 따라 1과 0의 합계를 수행합니다.

+0

답장을 보내 주셔서 감사합니다. 불행히도 모든 numUsersWhoLoggedInWithinLastMonth에 대해 '0'을 반환합니다. – jamesmstone

+0

이것이 효과가 있을지 모르지만 로그인하지 않은 사용자, 즉 일부 활성 사용자가 아닌 사용자는 'lastLogin' 값을 갖습니다. 'Null' – jamesmstone

+0

나는 당신의'<' for a '>'을 바꾸었고 현재 작동 중입니다! 감사!! – jamesmstone