有表如下:(表名为A)
 客户编码    客户名称   购买数量   交易总额   发生日期
 0001         张三      10         1200        2009.3.2
 0002                   20         2400        2009.3.5
 0001         张三      15         1800        2009.4.1
 0003                   2          240         2009.4.2
 0004         李四      5          600         2009.4.3
 ……我想使用聚合函数得到每个客户购买的次数和总金额,且客户名称为空时显示未登记,语句如下:
 select 客户编码,iif(isnull(客户名称),'未登记',客户名称) as 客户名称,count(客户编码) as 发生次数,sum(交易总额) as 交易合计 from A group by 客户编码,客户名称预想得到结果:
 0001    张三    2   3000
 0002    未登记  1   2400
 0003    未登记  1   240
 0004    李四    1   600结果却不对,问题出现在客户名称是空值的字段上!请各位高手指点个解决办法,谢谢先!

解决方案 »

  1.   

    select 客户编码,iif(isnull(客户名称),'未登记',客户名称) as 客户名称,count(客户编码) as 发生次数,sum(交易总额) as 交易合计 
    WHERE 客户编码 IS NOT NULL
    from A group by 客户编码,客户名称
      

  2.   

    select 客户编码,客户名称,count(1) 购买次数,sum(交易总额) 交易总额 from a where 客户名称 <> '' group by 客户编码,客户名称
    union all
    select 客户编码,客户名称='未登记',count(1) 购买次数,sum(交易总额) 交易总额 from a where 客户名称 = '' group by 客户编码
    order by 客户编码
      

  3.   

    --> 测试数据:[TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([客户编码] varchar(4),[客户名称] varchar(4),[购买数量] int,[交易总额] int,[发生日期] datetime)
    insert [TB]
    select '0001','张三',10,1200,'2009.3.2' union all
    select '0002',null,20,2400,'2009.3.5' union all
    select '0001','张三',15,1800,'2009.4.1' union all
    select '0003',null,2,240,'2009.4.2' union all
    select '0004','李四',5,600,'2009.4.3'
    select [客户编码],[客户名称]=isnull([客户名称],'未登记'),数量=count(1),[购买数量]=sum([购买数量])
    from TB group by [客户编码],[客户名称]
    order by [客户编码]/*
    客户编码 客户名称 数量          购买数量
    ---- ---- ----------- -----------
    0001 张三   2           25
    0002 未登   1           20
    0003 未登   1           2
    0004 李四   1           5(4 行受影响)
    */
    drop table TB
      

  4.   


    declare @tb table(客户编码 varchar(10),客户名称 varchar(10),购买数量 int, 交易总额  int,发生日期 varchar(10))
    insert @tb select 
    '0001',        '张三',      10    ,    1200  ,      '2009.3.2 'union all select
    '0002',          null   ,     20  ,      2400   ,    ' 2009.3.5 'union all select
    '0001',        '张三',      15    ,    1800    ,    '2009.4.1 'union all select
    '0003',         null    ,     2   ,       240   ,    ' 2009.4.2 'union all select
    '0004',        '李四',      5       ,   600   ,    ' 2009.4.3 'select 客户编码,isnull(客户名称,'未登记')客户名称,count(*) 发生次数, sum(交易总额)交易总额
    from @tb
    group by 客户编码,客户名称
    order by 客户编码客户编码       客户名称       发生次数        交易总额
    ---------- ---------- ----------- -----------
    0001       张三         2           3000
    0002       未登记        1           2400
    0003       未登记        1           240
    0004       李四         1           600(4 行受影响)
      

  5.   


    create table a (客户编码 varchar(20),客户名称 varchar(20),购买数量 int,交易总额 int,发生日期 datetime)
    insert a
    select '0001','张三',10,1200,'2009-3-2' union all
    select '0002',null,    20,2400,'2009-3-5' union all
    select '0001','张三',15,1800,'2009-4-1' union all
    select '0003',null,2,240,'2009-4-2' union all
    select '0004','李四',5,600,'2009-4-3'
    go-- drop table aselect 
    客户编码,isnull(客户名称,'未登记'),count(购买数量),sum(交易总额)
     from a 
     group by 客户编码,客户名称 order by 客户编码
    客户编码                                                              
    -------------------- -------------------- ----------- ----------- 
    0001                 张三                   2           3000
    0002                 未登记                  1           2400
    0003                 未登记                  1           240
    0004                 李四                   1           600(所影响的行数为 4 行)