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


391

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

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


4
* 표시 사용자 모두에게 우우, 사용 개수 (SomeColumnInYourTable) 위치 = '관리자'
마크 디킨슨

6
@ 마크 : 모든 현대적인 데이터베이스에서이하지 않는 어떤 차이를.
Philippe Leybaert

4
@ Mark & ​​Philippe : 실제로 큰 차이를 만들 수 있습니다. 필드가 널 입력 가능하고 색인화되지 않은 경우 조회는 테이블의 모든 레코드를 터치해야하므로 count (*) 및 count (field)를 사용하면 다른 결과와 다른 성능을 제공 할 수 있습니다.
구파

3
count (*)와 count (x)의 실행 계획을 몇 년 동안 분석했지만 지금까지 성능의 차이를 보여주는 단일 계획을 찾지 못했습니다. 그렇기 때문에 차이점이있는 쿼리의 예를 실제로보고 싶습니다.
Philippe Leybaert

2
@Matthew :에 대해 이야기하고 있지는 SELECT *않지만 SELECT COUNT(*)완전히 다른 짐승입니다.
Philippe Leybaert

답변:


663

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 ...

내 필드가 정수이고 null과 일치 시키려면 어떻게해야합니까? 그것은에서이 방법을 선택합니다 수 (경우 IntegerField 다음 'NULL'1 개 null를 끝) 작동하지 않습니다
Faizan

2
@Faizan null은 특별합니다. 사용case when IntegerField is null then ...
Peet Brits

부울 필드로 작업 할 때 다음을 사용할 수 있습니다.SUM(CONVERT(int, IsManager))
Simon_Weaver

2
SQL Server는 else nullfor case문을 암시 하므로 count()예를 들어 공백을 세면 10 자 더 짧을 수 있습니다.
마이클 - 클레이 셔키는 어디

212

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

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 ...

3
@RedFilter else부분 을 지정할 필요조차 없습니다 . end바로 다음 부분 을 지정 하십시오 1.
Denis Valeev

7
@Denis : 맞습니다- else특히 novie SQL 개발자를 위해 사례 진술의 결과를 더 잘 문서화하기 때문에 종종 들어갑니다. 간결하게하기 위해이 경우 제거 할 수 있습니다.
RedFilter

30

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

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

21

의미에 따라 다르지만 그 의미에 대한 다른 해석은 특정 값으로 행을 세고 싶지만 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

13

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')

5

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

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

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


1
편집은 그가 WHERE 절을 사용하여 행을 제한하고 싶지 않다는 것을 보여줍니다
KinSlayerUY

4

나는 이것이 실제로 오래되었다는 것을 알고 있지만, 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

의견 감사합니다 :-)



2

간단한 WHERE 절을 사용하여 일부 레코드 수만 선택할 수 있다고 생각합니다.


왜 다운 투표를 받습니까? 내가 대답 한 후 (또는 같은 시간 일 수 있음), 많은 사람들이 비슷한 말에 대답했으며 어떤 공감대도 얻지 못했습니다. / :(
NawaMan

4
질문은 "조건으로 값을 계산합니다"가 아니라 "횟수로 조건을 지정하십시오"이므로 다운 보트를받습니다. 그래서 당신은 잘못된 질문에 대답합니다
Radon8472

3
답을 내리는 것은 다소 불공평하다. 답이 쓰여졌을 때 그것은 질문에 대한 올바른 해결책이었다.…
Peter

2

다음은 각 선적 컨테이너 내에서 기준을 충족하는 총계와 수를 모두 포함하는 데이터 세트를 얻기 위해 수행 한 작업입니다. "크기 51을 초과하는 X % 이상의 품목을 가진 운송 컨테이너 수"라는 질문에 대답하겠습니다.

select
   Schedule,
   PackageNum,
   COUNT (UniqueID) as Total,
   SUM (
   case
      when
         Size > 51 
      then
         1 
      else
         0 
   end
) as NumOverSize 
from
   Inventory 
where
   customer like '%PEPSI%' 
group by
   Schedule, PackageNum


-4

이것을 사용하면 관리자 수를 얻을 수 있습니다

Select Position, count(*) as 'Position Counter'
from your_table 
group by Position 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.