[sql] Count ()에서 조건을 지정할 수 있습니까?

에 조건을 지정할 수 있습니까? Count() 있습니까? 위치 열에 예를 들어 “관리자”가있는 행만 계산하고 싶습니다.

count 문에서 사용하고 싶지만 WHERE; 나도 같은 모두 관리자와 기타를 계산해야하기 때문에 나는 그것에 대해 부탁 해요 SELECT처럼 (뭔가 Count(Position = Manager), Count(Position = Other))그래서 WHERE이 예에서는 나를 위해 아무 소용이 없습니다.



답변

where절로 쿼리 자체를 제한 할 수없는 경우 count집계에서 널이 아닌 값만 계산 한다는 사실을 사용할 수 있습니다 .

select count(case Position when 'Manager' then 1 else null end)
from ...

sum비슷한 방식으로 집계를 사용할 수도 있습니다 .

select sum(case Position when 'Manager' then 1 else 0 end)
from ...


답변

다른 값도 집계하기 때문에 리턴되는 행을 제한하지 않으려는 경우 다음과 같이 수행 할 수 있습니다.

select count(case when Position = 'Manager' then 1 else null end) as ManagerCount
from ...

Manager, Supervisor 및 Team Lead의 값이있는 동일한 열에서 다음과 같이 각각의 수를 얻을 수 있다고 가정합니다.

select count(case when Position = 'Manager' then 1 else null end) as ManagerCount,
    count(case when Position = 'Supervisor' then 1 else null end) as SupervisorCount,
    count(case when Position = 'Team Lead' then 1 else null end) as TeamLeadCount,
from ...


답변

@ 구파의 대답은 훌륭합니다 .IF 문으로 더 깨끗할 수도 있습니다.

select count(IF(Position = 'Manager', 1, NULL)) as ManagerCount
from ...


답변

의미에 따라 다르지만 그 의미에 대한 다른 해석은 특정 값으로 행을 세고 싶지만 SELECT그 행을 JUST 로 제한하고 싶지는 않습니다 …

다음을 사용 SUM()하는 대신 다음과 같은 절을 사용하여 수행하십시오 COUNT().

SELECT SUM(CASE WHEN Position = 'Manager' THEN 1 ELSE 0 END) AS ManagerCount,
    SUM(CASE WHEN Position = 'CEO' THEN 1 ELSE 0 END) AS CEOCount
FROM SomeTable


답변

SQL 2005 이상을 사용하는 경우 피벗 키워드를 사용할 수도 있습니다

더 많은 정보Technet에서

SELECT *
FROM @Users
PIVOT (
    COUNT(Position)
    FOR Position
    IN (Manager, CEO, Employee)
) as p

테스트 데이터 세트

DECLARE @Users TABLE (Position VARCHAR(10))
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('CEO')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')


답변

당신은 이것을 의미합니까?

SELECT Count(*) FROM YourTable WHERE Position = 'Manager'

그렇다면, 그것이 작동합니다!


답변

나는 이것이 실제로 오래되었다는 것을 알고 있지만, NULLIF그러한 시나리오에 대한 트릭을 좋아하며 지금까지 단점을 발견하지 못했습니다. 복사 및 붙여 넣을 수있는 예제를 참조하십시오. 실용적이지는 않지만 사용 방법을 보여줍니다.

NULLIF 성능에 약간의 부정적인 영향을 줄 수 있지만 하위 쿼리보다 여전히 빠릅니다.

DECLARE @tbl TABLE ( id [int] NOT NULL, field [varchar](50) NOT NULL)

INSERT INTO @tbl (id, field)
SELECT 1, 'Manager'
UNION SELECT 2, 'Manager'
UNION SELECT 3, 'Customer'
UNION SELECT 4, 'Boss'
UNION SELECT 5, 'Intern'
UNION SELECT 6, 'Customer'
UNION SELECT 7, 'Customer'
UNION SELECT 8, 'Wife'
UNION SELECT 9, 'Son'

SELECT * FROM @tbl

SELECT
    COUNT(1) AS [total]
    ,COUNT(1) - COUNT(NULLIF([field], 'Manager')) AS [Managers]
    ,COUNT(NULLIF([field], 'Manager')) AS [NotManagers]
    ,(COUNT(1) - COUNT(NULLIF([field], 'Wife'))) + (COUNT(1) - COUNT(NULLIF([field], 'Son'))) AS [Family]
FROM @tbl

의견 감사합니다 🙂