首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教小弟我的SQL语句有有关问题吗?如何结果不正确呢

2012-03-27 
请问我的SQL语句有问题吗?怎么结果不正确呢?我想按照产品类别统计合格率的问题,可是我的结果不对,请看看我

请问我的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

热点排行