读书人

请教小弟我的SQL语句有有关问题吗?如

发布时间: 2012-03-27 13:44:24 作者: rapoo

请问我的SQL语句有问题吗?怎么结果不正确呢?
我想按照产品类别统计合格率的问题,可是我的结果不对,请看看我的语句错在哪里?谢谢
CREATE TABLE test (xuhao char(6) ,
leibie char(6) ,
panding char(6))

insert into test
select '001 ', '甲 ', '合格 '
union all select '002 ', '甲 ', '不合格 '
union all select '003 ', '乙 ', '合格 '
union all select '004 ', '丙 ', '合格 '
union all select '005 ', '乙 ', '不合格 '
union all select '006 ', '丙 ', '合格 '
union all select '007 ', '甲 ', '不合格 '
union all select '008 ', '乙 ', '不合格 '
union all select '009 ', '丙 ', '合格 '
union all select '010 ', '甲 ', '合格 '
select * from test
select leibie,count(*) 总数,sum(CASE WHEN panding= '合格 ' THEN 1 else 0 END) AS 合格数,
合格率=100*(case when count(*) <> 0 then sum(CASE WHEN panding= '合格 ' THEN 1 else 0 END)/count(*) else 0 end)
from test group by leibie
上述语句的错误结果是:
xuhao leibie panding
------ ------ -------
001 甲 合格
002 甲 不合格
003 乙 合格
004 丙 合格
005 乙 不合格
006 丙 合格
007 甲 不合格
008 乙 不合格
009 丙 合格
010 甲 合格

(所影响的行数为 10 行)

leibie 总数 合格数 合格率
------ ----------- ----------- -----------
丙 3 3 100


甲 4 2 0
乙 3 1 0

(所影响的行数为 3 行)
其中合格率丙类正确,而甲类和乙类都不正确,什么原因?有没有更好的语句?谢谢啦


[解决办法]
select leibie,count(*) 总数,sum(case when panding= '合格 ' THEN 1 else 0 END) AS 合格数,
cast(sum(case when panding= '合格 ' THEN 1 else 0 END)*100.0/Count(*) as decimal(9,2)) as 合格率
from test group by leibie
[解决办法]
select leibie,count(*) 总数,sum(CASE WHEN panding= '合格 ' THEN 1 else 0 END) AS 合格数,
合格率=cast(100*cast((sum(CASE WHEN panding= '合格 ' THEN 1 else 0 END)) as numeric(9,2))/cast(count(*) as numeric(9,2)) as int)
from test
group by leibie
[解决办法]
--or
Select leibie,
count(*) 总数,sum(case when panding= '合格 ' THEN 1 else 0 END) AS 合格数,
case when Count(*) <> 0 then cast(sum(case when panding= '合格 '
THEN 1 else 0 END)*100/Count(*) as decimal(9,2)) else 0 end as 合格率
from test group by leibie

读书人网 >SQL Server

热点推荐