有这样一个数据表 :t_DeviceErrors(设备故障);字段:f_deviceId,f_style;(设备编号,故障类型)数据:
    f_deviceId     f_style
    0000000001      01
    0000000001      02
    0000000002      01
    0000000003      02
生成的交叉数据报表为:   f_deviceId      sum_Errors    sum_error_01  sum_error_02
   0000000001      2              1             1
   0000000002      1              1             0
   0000000003      1              0             1

解决方案 »

  1.   

    select f_deviceId,count(f_deviceId) as sum_Errors,sum(case when f_style='01' then 1 else 0 end) sum_error_01,sum(case when f_style='02' then 1 else 0 end) sum_error_02    
    group by f_deviceId
      

  2.   

    很感激suny_2001(小鱼儿)的回复。但是问题和你想象的一样糟糕,缺陷类型为01,02,03,04
    共四种,并且这里所用的数据库为 Oracle, 我试用过你上面所列示的方法,好像是没有用的;甚是感激!
      

  3.   

    cocainy:
    其实问题一点不糟糕的,而且很简单。你只要先GROUP BY f_style,
    然后利用循环生成SQL语句,你是ORCALE,我写的是MSSQL,
    你完全可以进行修改。
      

  4.   

    用循环作的交叉表,我在此之前已经实现过了.问题是在Intraweb 生成的叶面中每得到一个数据都要和数据库服务器交互,势必会降低效率! 所以我想问的是怎样用一条sql语句即可替代这个效率低的循环!
      

  5.   

    sqlserver:declare @sql varchar(8000)
    set @sql = 'select f_deviceId,sum(f_style) sum_Errors'
    select @sql = @sql + ',sum(casef_style when '''+cast(f_style as varchar(10))+''' then 1 else 0 end) [sum_error_'+cast(f_style as varchar(10))+']' from (select distinct f_style from t_DeviceErrors) as a
    select @sql = @sql+' from t_DeviceErrors group by f_deviceId'
    exec(@sql)
    go
      

  6.   

    oracle:select f_deviceId,count(f_deviceId) sum_Errors,
    sum(decode(f_style,'01',1,0)) sum_error_01,sum(decode(f_style,'02',1,0)) sum_error_02,
    sum(decode(f_style,'03',1,0)) sum_error_03,sum(decode(f_style,'04',1,0)) sum_error_04
    group by f_deviceId
      

  7.   

    To: PengDaLi,  Thks a lot;
      U R Riht!