现有数据表
ID  项目编号   生产完成状态
---------------------------
1    0001      已完成  
2    0002      已完成  
3    0001      已完成  
4    0002      未完成  
5    0003      已完成  
6    0003      未完成  
7    0001      未完成 
8    0001      已完成
9    0003      已完成
10   0001      已完成 
-----------------------------SELECT 项目编号,COUNT(项目编号) as 计划数, COUNT(生产完成状态 = 已完成) as 生产完成数, 完成百分比 from 数据表 group by 项目编号其中 生产完成数 和 完成百分比 怎么得出来???使用 (select count(生产完成状态) from 数据表 where 生产完成状态 = ‘已完成’)as 生产完成数 代替 COUNT(生产完成状态 = 已完成) 后得到的表中对应“生产完成状态”一列的汇总数为“数据表”中全部符合条件的数据汇总希望得出的格式为项目编号 | 计划数量 | 生产完成数量 | 完成百分比
------------------------------------------------------
0001         5              4              80%高手指教,使用的是.net程序 access 数据库 ,使用sql查询我该如何实现

解决方案 »

  1.   


    SELECT 
    a.项目编号,
    COUNT(a.项目编号) AS 计划数, 
    SUM(
    CASE 生产完成状态
    WHEN '未完成' THEN 0 
    WHEN '已完成' THEN 1
    END 
    ) AS 生产完成数 ,
     
     
    CAST(
    1.0 * SUM(
    CASE 生产完成状态
    WHEN '未完成' THEN 0 
    WHEN '已完成' THEN 1
    END 
    )  / COUNT(a.项目编号)  AS CHAR) + '%'FROM 数据表 AS a GROUP BY a.项目编号这是SQL Server的,不知道Access行不行。百分比的部分没加截断处理,应该难不倒你。
    不过用了CASE,估计运行速度会慢
    运行结果是这样
    CREATE TABLE 数据表(Id DECIMAL , 项目编号 NVARCHAR(10),生产完成状态 NVARCHAR(10))INSERT INTO 数据表
    VALUES(1,'00001','已完成')INSERT INTO 数据表
    VALUES(2,'00001','已完成')INSERT INTO 数据表
    VALUES(3,'00001','已完成')INSERT INTO 数据表
    VALUES(4,'00001','已完成')INSERT INTO 数据表
    VALUES(5,'00001','未完成')INSERT INTO 数据表
    VALUES(6,'00002','已完成')INSERT INTO 数据表
    VALUES(7,'00002','未完成')项目编号       计划数         生产完成数       
    ---------- ----------- ----------- -------------------------------
    00001      5           4           0.800000000000                %
    00002      2           1           0.500000000000                %(2 行受影响)
      

  2.   

    select 项目编号 , 
           计划数量 = count(1) ,
           生产完成数量 = (select count(1) from tb where 项目编号 = t.项目编号 and 生产完成状态 = '已完成') , 
           完成百分比 =  cast((select count(1) from tb where 项目编号 = t.项目编号 and 生产完成状态 = '已完成') * 100.00/count(1) as decimal(18,2))
    from tb
    group by 项目编号
      

  3.   

    create table tb(ID int,项目编号 varchar(10),生产完成状态 varchar(10))
    insert into tb values(1 , '0001', '已完成')   
    insert into tb values(2 , '0002', '已完成')   
    insert into tb values(3 , '0001', '已完成')   
    insert into tb values(4 , '0002', '未完成')   
    insert into tb values(5 , '0003', '已完成')   
    insert into tb values(6 , '0003', '未完成')   
    insert into tb values(7 , '0001', '未完成')  
    insert into tb values(8 , '0001', '已完成')
    insert into tb values(9 , '0003', '已完成')
    insert into tb values(10, '0001', '已完成')
    goselect 项目编号 , 
           计划数量 = count(1) ,
           生产完成数量 = (select count(1) from tb where 项目编号 = t.项目编号 and 生产完成状态 = '已完成') , 
           完成百分比 =  cast((select count(1) from tb where 项目编号 = t.项目编号 and 生产完成状态 = '已完成') * 100.00/count(1) as decimal(18,2))
    from tb t
    group by 项目编号drop table tb  /*
    项目编号       计划数量        生产完成数量      完成百分比                
    ---------- ----------- ----------- -------------------- 
    0001       5           4           80.00
    0002       2           1           50.00
    0003       3           2           66.67(所影响的行数为 3 行)*/
      

  4.   

    Access数据库好像不支持  CASE 、WHEN 、THEN 这些关键字啊,使用之后.net提示“IErrorInfo.GetDescription 因 E_FAIL(0x80004005) 而失败”
      

  5.   

    先谢谢大家,我再等等,如果没有什么可行的方法,再去Acceess板块询问看看,自己也顶一下,呵呵
      

  6.   

    case when ..then ..end 好象可以用IIF解决
      

  7.   

        sql 的办法一直没有解决,不过换了个方法算是达到目的了,好在使用的是Access数据库,数据量不是很大,替代的方法是:
    1 在数据库中自动建立具有与统计表结构相同的临时表;
    2 然后使用 “insert  into 统计表 Select 项目编号,count(1) as 计划数量,count(1)*0 as 生产完成,count(1)*0 as 生产完成率,count(1)*0 as 安装完成,count(1)*0 as 安装完成率 From 数据来源表 group by 项目编号”来初始化统计表;
    3 最后使用 Update 循环更新。
        虽然效率低但也还可以忍受,呵呵,暂时就先这么解决,大家要是有好的方法,希望能教教我啊,再等几天没有新方法的话就结贴了,先谢谢大家。
      

  8.   

    SELECT 
    a.项目编号,
    COUNT(a.项目编号) AS 计划数, 
    SUM( IIF(生产完成状态='未完成',0,1 ) ) AS 生产完成数 ,
    CAST(1.0 * SUM( IIF(生产完成状态='未完成',0,1) )  / COUNT(a.项目编号)  AS CHAR) + '%'
    FROM 数据表 AS a 
    GROUP BY a.项目编号
      

  9.   

    用IIF确实可以代替case when ..then ..end
    这个方法在Access中可以实现,谢谢了,也谢谢以上各位的帮助,没说的,结贴给分^_^