안녕하세요. 오늘은 PROC문에서 DISTINCT, CASE WHEN 을 사용하여 특정한 조건을 만족시키면서 동시에 중복을 무시하는 방법에 대해 알아 보겠습니다.
Data
예시로 사용될 데이터는 id, a, b, c 라는 네개의 변수로 만들었습니다. 총6개의 개체가 들어있고 각 변수들에는 중복되는 값이 들어가 있습니다.
Count distinct in case when
일반적으로 중복을 제거하기 위해 자주 쓰이는 DISTINCT를 COUNT 함수와 같이 사용한다면, DISTINCT가 쓰인 변수에서 중복이 제거된 자료값의 개수를 계산할 수 있습니다. 여기에 특별한 조건을 넣고 싶다면 CASE WHEN을 추가하면 됩니다.
PROC SQL문에서 Count함수에 Distinct함수를 같이 사용하여 변수 c에서 중복이 제거된 자료값의 개수가 4개로 계산되어 변수d_c에 나타내었습니다. 그리고 a가 20크고 b가 40보다 작은 새로운 조건을 CASE WHEN함수로 추가하여 조건을 만족하는 개체에 대해서만 변수 c의 중복을 제거한 자료값의 개수가 1개로 계산되어 변수 unique_casewhen로 나타내었습니다.
Sum distinct in case when
중복을 무시하고 자료값의 합을 계산 할 때도 CASE WHEN을 사용하여 조건을 만족시키는 중복제거를 할 수 있습니다. 다음은 변수 a에서 중복된 값을 무시하고 합계를 구하는 과정을 나타낸 것 입니다. 단순히 sum, distinct함수만을 사용한 것과 case when 으로 조건을 추가 시킨 것, distinct 함수 없이 case when함수만으로 조건을 만족시킨 합계를 구한 3가지 경우를 id변수로 그룹화 하여 나타낸 것입니다. coalesce함수는 만약에 조건에서 결측치가 나오는 경우 0을 출력하는 기능을 하고 있습니다.
단순히 중복된 값만 제거하고 변수a의 합을 구한 결과 그룹별로 35(12+23), 37(12+25)의 값이 계산 되었습니다. 조건을 만족하면서 중복을 제거한 변수a의 합은 각각 12, 37(12+25)의 값이, 조건만 만족하고 중복을 제거하지 않는 경우는 각각 12, 49(12+12+25)의 값이 계산되었습니다.
마치며
오늘은 PROC SQL문에서 필요한 조건을 만족하는 동시에 중복된 값을 제거할 때 DISTINCT함수와 CASE WHEN함수를 활용하는 법에 대해 알아보았습니다. 오늘 예를 들어본 개체의 수를 세는 경우(COUNT)와 자료값의 합을 구하는 경우(SUM)외에도 필요에 따라 여러 함수들과 함께 쓰일 수 있어 데이터를 분석할 때 유용하게 쓰일 수 있습니다.
Reference
http://www.listendata.com/2016/10/sas-sql-use-distinct-in-case-when.html
Save $250 on SAS Innovate and get a free advance copy of the new SAS For Dummies book! Use the code "SASforDummies" to register. Don't miss out, May 6-9, in Orlando, Florida.