实例明细表如下
收发日期       物码及规格名称            单位       收发数量
 
2011-08-28    抗盐                 吨         0.500
 
2011-08-29    抗盐                  吨         0.200
 
2011-08-27    防塌                   吨         3.000
 
2011-08-28    抗饱                   吨        0.500
 
2011-08-29    抗饱                    吨        1.0002011-08-30    抗饱                    吨        5.000 
编写sql 生成如下表物码及规格名称  单位  2011-08-27    2011-08-28       2011-08-29   2011-08-29   2011-08-30                   抗盐           吨       0.5          0.2防塌           吨       3             0                1抗饱           吨                     0.5              1                           5
在线等待。谢谢

解决方案 »

  1.   

    declare @sql varchar(8000)
    set @sql = 'select 物码及规格名称, 单位'
    select @sql = @sql + ' , max(case convert(varchar(10),收发日期,120) when ''' 
      +convert(varchar(10),收发日期,120)+ ''' then 收发数量 end) [' + convert(varchar(10),收发日期,120) + ']'
    from tb group by convert(varchar(10),收发日期,120)
    set @sql = @sql + ' from tb group by 物码及规格名称, 单位'
    exec(@sql)
      

  2.   

    统计后再用行列转置.
    http://blog.csdn.net/qianjin036a/article/details/6582237
      

  3.   

    sum or average aggregate 运算不能以 varchar 数据类型作为参数。
      

  4.   

    哥,你敢convert下不
    sum(convert(数值类型,varchar字段)) ?
      

  5.   

    sum or average aggregate 运算不能以 varchar 数据类型作为参数。
      

  6.   

    用max吧,你的数据好像不用sum
      

  7.   

    列 收发日期 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
      

  8.   

    或者这样declare @sql varchar(8000)
    set @sql = 'select 物码及规格名称, 单位'
    select @sql = @sql + ' , sum(case convert(varchar(10),收发日期,120) when ''' 
      +convert(varchar(10),收发日期,120)+ ''' then 收发数量 else 0 end) [' + convert(varchar(10),收发日期,120) + ']'
    from tb group by convert(varchar(10),收发日期,120)
    set @sql = @sql + ' from tb group by 物码及规格名称, 单位'
    exec(@sql)
      

  9.   

    明细表是我统计出来的不是一个真实的表
    select * from (SELECT (rtrim(j_wzbm)+' '+rtrim(w_wzmc)+' '+rtrim(w_ggxh)) as wmgg,w_jldw as jldw,Ltrim(RTrim(STR(sum(j_sl), 20, 3))) as sfsl,j_date as sfrq FROM  (  select * from (  select * from (select * FROM toperqx LEFT OUTER JOIN Tjhhqb ON left(Tjhhqb.j_wzbm,2)=toperqx.c_qx) lsdaywork  LEFT OUTER JOIN twzzl ON lsdaywork.j_wzbm=twzzl.w_wzbm  where lsdaywork.j_jgid='01' and lsdaywork.c_qxtag='1' and lsdaywork.c_cid='019'  and lsdaywork.j_date>='2011-08-26' and lsdaywork.j_date<='2011-09-26'  and (left(lsdaywork.j_wzbm,2)='08' or left(lsdaywork.j_wzbm,2)='10') ) daywork  ) cccc group by j_date,w_wzmc,w_ggxh,w_jldw) ccc
      

  10.   

    这样写后select wzbm,wmgg,jldw,max(case convert(varchar(10),sfrq,120) when ''  +convert(varchar(10),sfrq,120)+ '' then sfsl end) from (select * from (SELECT (rtrim(j_wzbm)+' '+rtrim(w_wzmc)+' '+rtrim(w_ggxh)) as wmgg,w_jldw as jldw,Ltrim(RTrim(STR(sum(j_sl), 20, 3))) as sfsl,j_date as sfrq FROM ( select * from ( select * from (select * FROM toperqx LEFT OUTER JOIN Tjhhqb ON left(Tjhhqb.j_wzbm,2)=toperqx.c_qx) lsdaywork LEFT OUTER JOIN twzzl ON lsdaywork.j_wzbm=twzzl.w_wzbm where lsdaywork.j_jgid='01' and lsdaywork.c_qxtag='1' and lsdaywork.c_cid='019' and lsdaywork.j_date>='2011-08-26' and lsdaywork.j_date<='2011-09-26' and (left(lsdaywork.j_wzbm,2)='08' or left(lsdaywork.j_wzbm,2)='10') ) daywork ) cccc group by j_date,w_wzmc,w_ggxh,w_jldw) ccc)cc group by wzbm,wmgg,jldw统计出来后面日期列不对 只有一个 无名列   而不是出现一些 日期
      

  11.   

    没关系,放到临时表里再按照我写的sql就可以了
    select * into #tb--临时表 #tb
    from (SELECT (rtrim(j_wzbm)+' '+rtrim(w_wzmc)+' '+rtrim(w_ggxh)) as wmgg,w_jldw as jldw,Ltrim(RTrim(STR(sum(j_sl), 20, 3))) as sfsl,j_date as sfrq FROM ( select * from ( select * from (select * FROM toperqx LEFT OUTER JOIN Tjhhqb ON left(Tjhhqb.j_wzbm,2)=toperqx.c_qx) lsdaywork LEFT OUTER JOIN twzzl ON lsdaywork.j_wzbm=twzzl.w_wzbm where lsdaywork.j_jgid='01' and lsdaywork.c_qxtag='1' and lsdaywork.c_cid='019' and lsdaywork.j_date>='2011-08-26' and lsdaywork.j_date<='2011-09-26' and (left(lsdaywork.j_wzbm,2)='08' or left(lsdaywork.j_wzbm,2)='10') ) daywork ) cccc group by j_date,w_wzmc,w_ggxh,w_jldw) cccdeclare @sql varchar(8000)
    set @sql = 'select 物码及规格名称, 单位'
    select @sql = @sql + ' , max(case convert(varchar(10),收发日期,120) when ''' 
      +convert(varchar(10),收发日期,120)+ ''' then 收发数量 end) [' + convert(varchar(10),收发日期,120) + ']'
    from #tb group by convert(varchar(10),收发日期,120)
    set @sql = @sql + ' from #tb group by 物码及规格名称, 单位'
    exec(@sql)
    --用完删除#tb
    drop table #tb
      

  12.   

    (不想回家的男人)你好 按照你上面说
    select * into #tb--临时表 #tb
     from (SELECT j_wzbm as wzbm,(rtrim(j_wzbm)+' '+rtrim(w_wzmc)+' '+rtrim(w_ggxh)) as wmgg,w_jldw as jldw,Ltrim(RTrim(STR(j_dj, 20, 2))) as wzdj,Ltrim(RTrim(STR(sum(j_sl), 20, 3))) as sfsl,Ltrim(RTrim(STR(sum(round(convert(numeric(38,3),j_sl*j_dj),2)), 20, 2))) as sfje,j_date as sfrq FROM  (  select * from (  select * from (select * FROM toperqx LEFT OUTER JOIN Tjhhqb ON left(Tjhhqb.j_wzbm,2)=toperqx.c_qx) lsdaywork  LEFT OUTER JOIN twzzl ON lsdaywork.j_wzbm=twzzl.w_wzbm  where lsdaywork.j_jgid='01' and lsdaywork.c_qxtag='1' and lsdaywork.c_cid='019'  and lsdaywork.j_date>='2011-08-26' and lsdaywork.j_date<='2011-09-26'  and (left(lsdaywork.j_wzbm,2)='08' or left(lsdaywork.j_wzbm,2)='10') ) daywork  ) cccc group by j_date,j_wzbm,w_wzmc,w_ggxh,w_jldw,j_dj) ccc
    declare @sql varchar(8000)
    set @sql = 'select wmgg, jldw'
    select @sql = @sql + ' , max(case convert(varchar(10),sfrq,120) when ''' 
      +convert(varchar(10),sfrq,120)+ ''' then sfsl end) [' + convert(varchar(10),sfrq,120) + ']'
    from #tb group by convert(varchar(10),sfrq,120)
    set @sql = @sql + ' from #tb group by wmgg, jldw'
    exec(@sql)提示如下提示
    服务器: 消息 8120,级别 16,状态 1,行 5
    列 '#tb.sfrq' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
    服务器: 消息 8120,级别 16,状态 1,行 5
    列 '#tb.sfrq' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
      

  13.   

    declare @sql varchar(8000)
    set @sql = 'select 物码及规格名称, 单位'
    select @sql = @sql + ' , max(case convert(varchar(10),收发日期,120) when ''' 
      +convert(varchar(10),收发日期,120)+ ''' then 收发数量 end) [' + convert(varchar(10),收发日期,120) + ']'
    from #tb group by convert(varchar(10),收发日期,120)
    set @sql = @sql + ' from #tb group by 物码及规格名称, 单位'
    exec(@sql)
      

  14.   

    declare @sql varchar(8000)
    set @sql = 'select 物码及规格名称, 单位'
    select @sql = @sql + ' , max(case convert(varchar(10),收发日期,120) when '''  
      +convert(varchar(10),收发日期,120)+ ''' then 收发数量 end) [' + convert(varchar(10),收发日期,120) + ']'
    from #tb group by convert(varchar(10),收发日期,120)
    set @sql = @sql + ' from #tb group by 物码及规格名称, 单位'
    exec(@sql)