我正在尝试在SQL Server 2008 R2中做一些交叉表。那部分还好,但是,如果我尝试获取每个单元格的百分比,就会遇到问题。
这是一个提炼的用例:一项调查,人们在其中给出自己喜欢的颜色和喜欢的水果。我想知道有多少喜欢给定的水果和给定的颜色:
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
我期待的是:
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
请帮助我达到我的期望吗?
您正在使用SQL Server。这是一个更简单的示例来复制问题:
select 1/2
SQL Server执行整数除法。
用sum(1.0)或sum(cast 1 as float)或sum(1e0)代替分母sum(1)。
sum(1.0)
sum(cast 1 as float)
sum(1e0)
sum(1)
至少与我的预期相反,SQL Server将带小数点的数字存储为数字/小数类型(请参见此处),而不是float。固定数量的小数位数可能会影响后续操作。
float