表如下所示:
表 tb
pid  客户名称  客户金额     时间        延期 
001    A       14145      2007-1-2     是
002    B       885       2007-2-9      是
003    A       1254      2007-2-7      否
109    C       6352      2007-1-3      是
200    A       1245      2007-1-7      否
…………………………………………………………
pid是主键,每一行代表一个合同。需要的结果是统计在2007年内每个客户有多少个合同,延期的合同占其合同总数的百分比。
结果如下:
客户名称   延期合同数 合同数 延期比例
  A          1       3     33.3%
  B          0       1     0
  C          1       1     100%对于达人来说也是小case,让我学习下,给20分聊表心意。

解决方案 »

  1.   

    select 客户名称 , 
           延期合同数 = (select count(*) from tb where 客户名称 = t.客户名称 and 延期 = '是') , 
           合同数 = count(*),
           延期比例 = (select count(*) from tb where 客户名称 = t.客户名称 and 延期 = '是')*100.0 / count(*)
    from tb
    group by 客户名称
      

  2.   

    create table tb(pid char(3),客户名称 char(1),客户金额 int,时间 datetime,延期 char(2))
    insert into tb select '001',         'A'    ,           14145,             '2007-1-2'   ,        '是' 
    insert into tb select '002' ,        'B'   ,            885   ,            '2007-2-9'  ,           '是' 
    insert into tb select '003'  ,       'A'  ,             1254   ,          '2007-2-7'  ,           '否' 
    insert into tb select '109'   ,      'C' ,              6352    ,         '2007-1-3' ,            '是' 
    insert into tb select '200'    ,     'A',               1245     ,        '2007-1-7',             '否' select 客户名称
          ,sum(case when 延期='是' then 1 else 0 end) [延期合同数]
          ,count(*) 合同数
          ,rtrim(sum(case when 延期='是' then 1 else 0 end)*100/count(*))+'%' [延期比例]
    from tb
    group by 客户名称drop table tb/*
    客户名称 延期合同数       合同数         延期比例          
    ---- ----------- ----------- ------------- 
    A    1           3           33%
    B    1           1           100%
    C    1           1           100%(所影响的行数为 3 行)
    */
      

  3.   

    create table tb(pid varchar(10), 客户名称 varchar(10), 客户金额 int, 时间 datetime , 延期 varchar(10))
    insert into tb values('001', 'A', 14145, '2007-1-2', '是') 
    insert into tb values('002', 'B', 885  , '2007-2-9', '是') 
    insert into tb values('003', 'A', 1254 , '2007-2-7', '否') 
    insert into tb values('109', 'C', 6352 , '2007-1-3', '是') 
    insert into tb values('200', 'A', 1245 , '2007-1-7', '否')
    goselect 客户名称 , 
           延期合同数 = (select count(*) from tb where 客户名称 = t.客户名称 and 延期 = '是') , 
           合同数 = count(*),
           延期比例 = (select count(*) from tb where 客户名称 = t.客户名称 and 延期 = '是')*100.0 / count(*)
    from tb t
    group by 客户名称drop table tb/*
    客户名称       延期合同数       合同数         延期比例                         
    ---------- ----------- ----------- ---------------------------- 
    A          1           3           33.333333333333
    B          1           1           100.000000000000
    C          1           1           100.000000000000(所影响的行数为 3 行)
    */
      

  4.   

    create table tb(pid varchar(10), 客户名称 varchar(10), 客户金额 int, 时间 datetime , 延期 varchar(10))
    insert into tb values('001', 'A', 14145, '2007-1-2', '是') 
    insert into tb values('002', 'B', 885  , '2007-2-9', '是') 
    insert into tb values('003', 'A', 1254 , '2007-2-7', '否') 
    insert into tb values('109', 'C', 6352 , '2007-1-3', '是') 
    insert into tb values('200', 'A', 1245 , '2007-1-7', '否')
    goselect 客户名称 , 
           延期合同数 = (select count(*) from tb where 客户名称 = t.客户名称 and 延期 = '是') , 
           合同数 = count(*),
           延期比例 = cast(cast((select count(*) from tb where 客户名称 = t.客户名称 and 延期 = '是')*100.0 / count(*) as decimal(18,2)) as varchar) + '%'
    from tb t
    group by 客户名称drop table tb/*
    客户名称       延期合同数       合同数         延期比例                            
    ---------- ----------- ----------- ------------------------------- 
    A          1           3           33.33%
    B          1           1           100.00%
    C          1           1           100.00%(所影响的行数为 3 行)
    */
      

  5.   

    我临时写了一个,你试一下.
    SELECT  客户名称 ,
        CAST( WHEN 延期 = '是' THEN COUNT(pid) END ,
        COUNT(pid) ,
        CAST( WHEN 延期 = '是' THEN COUNT(pid) END/COUNT(pid)
    WHERE CONVERT(CHAR4) , 时间  ,120) = '2007'
    GROUP BY 客户名称