本帖最后由 iamggggs 于 2012-04-19 21:30:20 编辑

解决方案 »

  1.   


    go
    if OBJECT_ID('report')is not null
    drop table report
    go
    create table report(
    销售员 varchar(10),
    销售组 varchar(8),
    产品名称 varchar(10),
    产品组别 varchar(10),
    销售金额 money,
    销售日期 date,
    )
    go
    insert report
    select '周','A','产品1','产品甲组',10000,'2012-04-01' union all
    select '王','B','产品2','产品乙组',0,'2012-04-03' union all
    select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all
    select '李','C','产品3','产品甲组',30000,'2012-04-09' union all
    select '孙','B','产品2','产品乙组',1,'2012-04-11' 
    go
    declare @str varchar(max)
    set @str=''
    select @str=@str+','+产品组别+'个数=count(case when 产品组别='+QUOTENAME(产品组别,'''')+
    ' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+
    ' then 销售金额 else 0 end)' from report
    group by 产品组别
    exec('select 销售组'+@str+',sum(销售金额) as  总金额 from report group by 销售组')
    --是你的结果有问题还是我的算法错误?不过我按照你的结果分析,不晓得是怎么回事。
    /*
    销售组 产品甲组个数 产品甲组金额 产品乙组个数 产品乙组金额 总金额
    A 1 10000.00 1 0.00 10000.00
    B 3 50000.00 3 1.00 50001.00
    C 1 30000.00 1 0.00 30000.00
    */
      

  2.   


    go
    if OBJECT_ID('report')is not null
    drop table report
    go
    create table report(
    销售员 varchar(10),
    销售组 varchar(8),
    产品名称 varchar(10),
    产品组别 varchar(10),
    销售金额 money,
    销售日期 date,
    )
    go
    insert report
    select '周','A','产品1','产品甲组',10000,'2012-04-01' union all
    select '王','B','产品2','产品乙组',0,'2012-04-03' union all
    select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all
    select '李','C','产品3','产品甲组',30000,'2012-04-09' union all
    select '孙','B','产品2','产品乙组',1,'2012-04-11' 
    go
    declare @str varchar(max)
    set @str=''
    select @str=@str+','+产品组别+'个数=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+
    ' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+
    ' then 销售金额 else 0 end)' from report
    group by 产品组别
    exec('select 销售组'+@str+',sum(销售金额) as  总金额 from report group by 销售组')
    --是你的结果有问题还是我的算法错误?不过我按照你的结果分析,不晓得是怎么回事。
    /*
    销售组 产品甲组个数 产品甲组金额 产品乙组个数 产品乙组金额 总金额
    A 1 10000.00 0 0.00 10000.00
    B 1 50000.00 2 1.00 50001.00
    C 1 30000.00 0 0.00 30000.00
    */--应该这样,楼上作废
      

  3.   

    有点晕菜,测试数据用你的语句完全对,但放到实际数据库就报错字段名略有变化,字段类型是一样的,我查找一下。。能否授之以渔:讲解一下@str、QUOTENAME的用法?太晚了就明天吧,谢谢你了,第二次请教了。
      

  4.   


    我那号被封了,换这个号,你试试下面的语句,我觉得不应该是quotename的问题
    declare @str varchar(max)
    set @str=''
    select @str=@str+','+产品组别+'个数=sum(case when 产品组别='+'''产品组别'''+
    ' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+'''产品组别'''+
    ' then 销售金额 else 0 end)' from report
    group by 产品组别
    exec('select 销售组'+@str+',sum(销售金额) as  总金额 from report group by 销售组')
      

  5.   

    实在没搞懂,放到实际数据库运行直接报错:
    declare @str varchar(max)
    set @str=''
    select @str=@str+','+产品类型+'个数=sum(case when 产品类型='+'''产品类型'''+
    ' then 1 else 0 end),'+产品类型+'金额=sum(case when 产品类型='+'''产品类型'''+
    ' then 签约资产 else 0 end)' from 销售情况表
    group by 产品类型
    exec('select 销售小组'+@str+',sum(签约资产) as  总金额 from 销售情况表 group by 销售小组')
    /*
    消息 102,级别 15,状态 1,第 1 行
    '=' 附近有语法错误。
    */
      

  6.   

    找到原因了:实际数据库的 销售金额 和 产品组别这些字段的类型都是nchar,测试数据用的varchar...怎么改语句?
    假设测试数据是这样:
    go
    if OBJECT_ID('report')is not null
    drop table report
    go
    create table report(
    销售员 nchar(10),
    销售组 nchar(8),
    产品名称 nchar(10),
    产品组别 nchar(10),
    销售金额 money,
    销售日期 date,
    )
    go
    insert report
    select '周','A','产品1','产品甲组',10000,'2012-04-01' union all
    select '王','B','产品2','产品乙组',0,'2012-04-03' union all
    select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all
    select '李','C','产品3','产品甲组',30000,'2012-04-09' union all
    select '孙','B','产品2','产品乙组',1,'2012-04-11' 
      

  7.   

    declare @str varchar(max)改成nchar的话,运行结果只有小组和总金额显示了。可原数据库字段就是用的nchar。太晚了,明儿再说吧。
      

  8.   

    declare @str varchar(max)
    set @str='select 销售组'
    select @str=@str+',sum(case when 产品组别='''+产品组别+'''
     then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+'''
     then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report
    group by 产品组别
    set @str=@str+', sum(销售金额) as  总金额 from report group by 销售组'
    print @str
    exec(@str)
      

  9.   

    declare @str varchar(max)
    set @str='select 销售组'
    select @str=@str+',sum(case when 产品组别='''+产品组别+'''
     then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+'''
     then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report
    group by 产品组别
    set @str=@str+', sum(销售金额) as  总金额 from report group by 销售组'
    print @str
    exec(@str)
      

  10.   


    感谢,测试通过!
    再加深一步:如果要将上述查询的结果保存为一个临时的记录集,改如何写?因为有可能需要对这个记录集进行另外条件的查询,比如将某些金额或个数用特定条件汇总输出。
    比如用 with a as 将上述查询得到的记录集保存到临时记录集a中,再对a进行条件查询。
      

  11.   

    declare @str varchar(max)
    set @str='with t as (select 销售组'
    select @str=@str+',sum(case when 产品组别='''+产品组别+'''
     then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+'''
     then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report
    group by 产品组别
    set @str=@str+', sum(销售金额) as 总金额 from report group by 销售组) select *from t'
    print @str
    exec(@str)
      

  12.   


    我要对临时表t进行条件查询输出就在
    select * from t
    里面改是吧?但我改成 
    select * from t where 销售组='A'
    回报‘销售组’附近有语法错误?