2013-01-14 2 views
1

SQL Server 2008 R2에서 일부 크로스 탭을 수행하려고합니다. 그 부분은 괜찮습니다. 그러나 각 셀에 대한 백분율을 얻으려고하면 문제가 발생합니다.SQL의 집계 함수가 예상대로 작동하지 않음

사람들이 좋아하는 색과 좋아하는 과일을주는 설문지입니다.

fav_color banana banana_pct total 
------------------------------------ 
blue  0  0   1 
green  0  0   1 
purple  0  0   1 
red   1  50   2 
yellow  1  50   2 

얻을 제발 도와주세요 :

with survey as (
    select 'banana' fav_fruit, 'yellow' fav_color 
    union select 'banana', 'red' 
    union select 'apple', 'yellow' 
    union select 'grape', 'red' 
    union select 'apple', 'blue' 
    union select 'orange', 'purple' 
    union select 'pomegranate', 'green' 
) 
select 
    s.fav_color, 
    sum(case 
      when s.fav_fruit = 'banana' then 1 
      else 0 
     end) as banana, 
    sum(case 
      when s.fav_fruit = 'banana' then 1 
      else 0 
     end)/sum(1) -- why does division always yield 0? "+", "-", and "*" all behave as expected. 
     * 100 as banana_pct, 
    sum(1) as total 
from 
    survey s 
group by 
    s.fav_color; 

결과 :

fav_color banana banana_pct total 
------------------------------------ 
blue  0  0   1 
green  0  0   1 
purple  0  0   1 
red   1  0   2 
yellow  1  0   2 

내가 기대 한 내가 주어진 과일과 주어진 색상과 같은 몇을 알고 싶습니다 나는 무엇을 기대하고 있었습니까?

답변

5

SQL Server를 사용하고 있습니다. 다음은 문제를 복제하는 훨씬 간단한 예제입니다.

select 1/2 

SQL Server는 정수 나누기를 수행합니다.

sum(1) 대신 sum(1.0) 또는 sum(cast 1 as float) 또는 sum(1e0)과 같은 분모를 사용하십시오.

필자의 예상과는 달리 SQL Server는 float 대신 숫자/십진 형식의 소수점 숫자를 사용합니다 (here 참조). 고정 소수점 자리수는 후속 작업에 영향을 줄 수 있습니다.

+1

좋은 슬픔. ** ** 약간 더 단순화 된 예제입니다. 나는 내 시험을 그다지 해칠 생각조차하지 않았다. ;-) –

0

검색어 :

SQLFIddleexample

SELECT s.fav_color, 
     sum(CASE WHEN s.fav_fruit = 'banana' THEN 1 ELSE 0 END) AS banana, 
     sum(CASE WHEN s.fav_fruit = 'banana' THEN 1 ELSE 0 END)/sum(1.00) -- why does division always yield 0? "+", "-", and "*" all behave as expected. 
* 100 AS banana_pct, 
    sum(1) AS total 
FROM survey s 
GROUP BY s.fav_color 

결과 :

| FAV_COLOR | BANANA | BANANA_PCT | TOTAL | 
------------------------------------------- 
|  blue |  0 |   0 |  1 | 
|  green |  0 |   0 |  1 | 
| purple |  0 |   0 |  1 | 
|  red |  1 |   50 |  2 | 
| yellow |  1 |   50 |  2 |