bzrq            bzzb                    bzline                  bzcplb                  bztype          無列名   無列名
20090105 FQC                  I1                   LGP裁切              5S         80 240
20090105 FQC                  I1                   LGP裁切              休息       40 880
20090105 FQC                  I1                   LGP裁切              休息       40 1040
20090105 FQC                  I1                   LGP裁切              休息       240 1040
20090105 FQC                  I1                   LGP裁切              休息       40 1040
20090105 FQC                  I1                   LGP裁切              休息       240 1040
20090105 FQC                  I1                   LGP裁切              休息       40 1040
20090105 FQC                  I1                   LGP裁切              休息       240 1040
20090105 FQC                  I1                   LGP裁切              5S         80 1040
20090105 FQC                  I1                   LGP裁切              休息       40 80
20090105 FQC                  I1                   LGP裁切              休息       240 80
20090105 FQC                  I1                   LGP裁切              休息       40 80
20090105 FQC                  I1                   LGP裁切              休息       240 80
20090105 FQC                  I1                   LGP裁切              休息       40 80
20090105 FQC                  I1                   LGP裁切              休息       240 80
20090105 FQC                  I1                   LGP裁切              休息       40 80
20090105 FQC                  I1                   LGP裁切              休息       240 80
20090105 FQC                  I1                   LGP裁切              5S         80 80
20090105 FQC                  I1                   LGP裁切              休息       40 480
20090105 FQC                  I1                   LGP裁切              5S         80 480
20090105 FQC                  I1                   LGP裁切              休息       240 960
20090105 FQC                  I1                   LGP裁切              5S         80 960
20090105 FQC                  I1                   LGP裁切              5S         80 880
20090104 FQC                  I1                   LGP裁切              休息       240 40
20090104 FQC                  I1                   LGP裁切              休息       40 40
20090104 FQC                  I1                   LGP裁切              休息       240 40
20090104 FQC                  I1                   LGP裁切              休息       40 200
20090104 FQC                  I1                   LGP裁切              休息       240 200
20090104 FQC                  I1                   LGP裁切              休息       240 200
20090104 FQC                  I1                   LGP裁切              待料       240 200
20090104 FQC                  I1                   LGP裁切              待排程     480 200
20090104 FQC                  I1                   LGP裁切              待排程     280 200
20090104 FQC                  I1                   LGP裁切              休息       240 200
20090104 FQC                  I1                   LGP裁切              休息       40 200
20090104 FQC                  I1                   LGP裁切              休息       240 200
20090104 FQC                  I1                   LGP裁切              休息       40 800
20090104 FQC                  I1                   LGP裁切              休息       240 800
20090104 FQC                  I1                   LGP裁切              休息       240 800
20090104 FQC                  I1                   LGP裁切              待料       240 800
20090104 FQC                  I1                   LGP裁切              待排程     480 800
20090104 FQC                  I1                   LGP裁切              待排程     280 800
20090104 FQC                  I1                   LGP裁切              休息       240 800
20090104 FQC                  I1                   LGP裁切              休息       40 800
20090104 FQC                  I1                   LGP裁切              休息       240 800
20090104 FQC                  I1                   LGP裁切              休息       40 480
20090104 FQC                  I1                   LGP裁切              休息       240 480
20090104 FQC                  I1                   LGP裁切              休息       240 480
20090104 FQC                  I1                   LGP裁切              休息       40 120
20090104 FQC                  I1                   LGP裁切              休息       240 120
20090103 FQC                  I1                   LGP裁切              待排程     160 960
20090103 FQC                  I1                   LGP裁切              休息       40 960
20090103 FQC                  I1                   LGP裁切              休息       240 960
20090103 FQC                  I1                   LGP裁切              休息       40 960
20090103 FQC                  I1                   LGP裁切              休息       240 960
20090103 FQC                  I1                   LGP裁切              待排程     480 960
20090103 FQC                  I1                   LGP裁切              休息       240 960
20090103 FQC                  I1                   LGP裁切              休息       40 960
20090103 FQC                  I1                   LGP裁切              休息       240 960
20090103 FQC                  I1                   LGP裁切              休息       40 800
20090103 FQC                  I1                   LGP裁切              休息       240 800
20090103 FQC                  I1                   LGP裁切              休息       40 800
20090103 FQC                  I1                   LGP裁切              休息       240 800
20090103 FQC                  I1                   LGP裁切              待排程     480 800
20090103 FQC                  I1                   LGP裁切              休息       240 800
20090103 FQC                  I1                   LGP裁切              休息       40 800
20090103 FQC                  I1                   LGP裁切              休息       240 800
20090103 FQC                  I1                   LGP裁切              待排程     160 1040
20090103 FQC                  I1                   LGP裁切              休息       40 1040
20090103 FQC                  I1                   LGP裁切              休息       240 1040
20090103 FQC                  I1                   LGP裁切              休息       40 1040
20090103 FQC                  I1                   LGP裁切              休息       240 1040
20090103 FQC                  I1                   LGP裁切              待排程     480 1040
20090103 FQC                  I1                   LGP裁切              休息       240 1040
20090103 FQC                  I1                   LGP裁切              休息       40 1040
20090103 FQC                  I1                   LGP裁切              休息       240 1040
20090103 FQC                  I1                   LGP裁切              待排程     160 960
20090103 FQC                  I1                   LGP裁切              休息       40 960
20090103 FQC                  I1                   LGP裁切              休息       240 960
20090103 FQC                  I1                   LGP裁切              休息       40 960
20090103 FQC                  I1                   LGP裁切              休息       240 960
20090103 FQC                  I1                   LGP裁切              待排程     480 960
20090103 FQC                  I1                   LGP裁切              休息       240 960
20090103 FQC                  I1                   LGP裁切              休息       40 960
20090103 FQC                  I1                   LGP裁切              休息       240 960
20090102 FQC                  I1                   LGP裁切              休息       40 80
20090102 FQC                  I1                   LGP裁切              休息       240 20
20090102 FQC                  I1                   LGP裁切              待排程     480 20
20090102 FQC                  I1                   LGP裁切              休息       240 20
20090102 FQC                  I1                   LGP裁切              休息       240 20

解决方案 »

  1.   


    --以下是SQL
    declare @tbl table
    (
    bzrq nchar(8) ,
    bzzb nvarchar(50) ,
    bzline nvarchar(50) ,
    bzcplb nvarchar(50) ,
    bztype nvarchar(50) ,
    TimeNum int,
    total int )
    insert into @tbl 
    --以下代碼是得到數據 
    select tbLineRate.bzrq 
    ,tbLineRate.bzzb 
    ,tbLineRate.bzline 
    ,tbLineRate.bzcplb 
    ,tbLineRate.bztype 
    ,tbLineRate.timenum*tbLineRate.bzrs
    ,(tbl_PrdRate.TimeNum-tbl_PrdRate.bzNoTime3)*tbl_PrdRate.liners
     from tbLineRate,tbl_PrdRate 
    where rtrim(ltrim(tbLineRate.bzrq))=rtrim(ltrim(tbl_PrdRate.bzrq))
    and rtrim(ltrim(tbLineRate.bzzb)) COLLATE Chinese_Taiwan_Stroke_CI_AS=rtrim(ltrim(tbl_PrdRate.bzzb))
    and rtrim(ltrim(tbLineRate.bzline)) COLLATE Chinese_Taiwan_Stroke_CI_AS=rtrim(ltrim(tbl_PrdRate.bzline))
    and rtrim(ltrim(tbLineRate.bzcplb)) COLLATE Chinese_Taiwan_Stroke_CI_AS=rtrim(ltrim(tbl_PrdRate.bzcplb))
    and len(tbLineRate.bzrq)=8
    and tbLineRate.bzrq between 20090101 and 20090105
    and tbLineRate.bzzb COLLATE Chinese_Taiwan_Stroke_CI_AS like '%FQC%'
    and tbLineRate.bzline COLLATE Chinese_Taiwan_Stroke_CI_AS like '%I1%'
    and tbLineRate.bzcplb COLLATE Chinese_Taiwan_Stroke_CI_AS like '%LGP裁切%'    
    ---------------------------------
         
    create  table #tbltmp
    (
    bztype nvarchar(50),
    rq nchar(8),
    num int,
    total int
    )insert into #tbltmp
    select a.bztype,a.rq,sum(TimeNum) as num,sum(total)total from
    (
        select bztype,right(bzrq,8)as rq,TimeNum,total from @tbl a
    ) as a group by a.bztype,a.rq
    declare @sql varchar(max)
    set @sql = ' select isnull(bztype,''百分比'') [原因],'
    select @sql= @sql+'case when grouping(bztype)=0 then rtrim(sum(case rq when '''+rq+''' then num  else 0 end)) else ltrim(str( sum(case rq when '''+rq+''' then num  else 0 end)*100.0/sum(total),8,2))+''%'' end as  ['+rq+'],'
        from (select distinct rq from #tbltmp ) a
    set @sql = stuff(@sql,len(@sql),1,'')
    set @sql=@sql+ ',case when grouping(bztype)=0 then rtrim(sum(num)) else '''' end 合計 from #tbltmp group by bztype with rollup'set @sql=@sql+' union select ''非生產時間合計'','
    select @sql=@sql+'cast((select sum(num) from #tbltmp where rq='''+rq+''') as varchar),' from (select distinct rq from #tbltmp ) b
    set @sql=@sql+'cast((select sum(num) from #tbltmp) as varchar)'set @sql=@sql+' union select ''生產時間合計'','
    select @sql=@sql+'cast((select sum(total) from #tbltmp where rq='''+rq+''') as varchar),' from (select distinct rq from #tbltmp ) b
    set @sql=@sql+'cast((select sum(total) from #tbltmp) as varchar)'set @sql='select * from  ('+@sql+') z  order by case z.[原因] when ''非生產時間合計'' then ''300'' when ''生產時間合計'' then ''200'' when ''百分比'' then ''100'' else z.[原因] end desc  '
    exec(@sql)drop table #tbltmp
    --結果:
    原因              20090102   20090103   20090104  20090105    合計
    待排程     3840    5120       7600 0     16560
    待料       0    0       2400 0     2400
    休息       8320    8640       10400 7840     35200
    5S         0    0       0         560     560
    非生產時間合計 12160    13760      20400 8400     54720
    生產時間合計 29680    36360      33480 41040     140560
    百分比          8.65%    9.79%      14.51% 5.98% 以上的問題:
    1.百分比計算不對,應該是非生產時間合計/生產時間合計
    2.合計也要有百分比
    請大家幫忙解決一下
      

  2.   


    declare @table table (原因 varchar(14),[20090102] varchar(8),[20090103] varchar(8),[20090104] varchar(8),[20090105] varchar(8),合計
     varchar(6))
    insert into @table
    select '非生產時間合計','12160','13760','20400','8400','54720' union all
    select '生產時間合計','29680','36360','33480','41040','140560' 
    select * from @table
    /*
    原因             20090102 20090103 20090104 20090105 合計
    -------------- -------- -------- -------- -------- ------
    非生產時間合計        12160    13760    20400    8400     54720
    生產時間合計         29680    36360    33480    41040    140560
    */估计楼主就是要在下面加上百分比
      

  3.   

    汇总的表格,数据量很小,还不如在客户端来算百分比方便,单纯为了这个功能吧sql语句写的很复杂实在没有必要
      

  4.   

    楼主的代码里主要用到了两个表:tbLineRate,tbl_PrdRate
    最上面的测试数据只有一个表,还有两列没有列名? 
      

  5.   

    我已經給出了,測試數據,主要的問題是解決百分比的計算,現在的SQL也計算出了百分比,計算的不對,請大家幫我修改一下
      

  6.   


    无列名是怎么回事?
    (tbl_PrdRate.TimeNum-tbl_PrdRate.bzNoTime3)*tbl_PrdRate.liners 又是怎么回事?
    生產時間是哪一个字段??