//看这代码有什么不妥之处?
procedure TForm10.Button2Click(Sender: TObject);
begin
datamodule5.adoquery_xy.Close;
datamodule5.adoquery_xy.SQL.Clear;
datamodule5.adoquery_xy.SQL.Add('select distinct 系别,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 教授 then 1 else 0) as 教授,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 副教授 then 1 else 0) as 副教授,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 硕士 then 1 else 0) as 硕士,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 研究生 then 1 else 0) as 研究生,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 本科 then 1 else 0) as 本科,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 本科成 then 1 else 0) as 本科成,');
datamodule5.adoquery_xy.sql.Add('sum(case 学历 when 专科 then 1 else 0) as 专科,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 高中 then 1 else 0) as 高中,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 中专 then 1 else 0) as 中专,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 初中 then 1 else 0) as 初中,');
datamodule5.adoquery_xy.SQL.Add('sum(case 学历 when 其它 then 1 else 0) as 其它');
datamodule5.adoquery_xy.SQL.Add(' from table1');
datamodule5.adoquery_xy.SQL.Add(' where 聘用时间>:A and 聘用时间<:B');
datamodule5.adoquery_xy.Parameters.ParamByName('A').Value:=datetimepicker1.DateTime;
datamodule5.adoquery_xy.Parameters.ParamByName('B').Value:=datetimepicker2.DateTime;
datamodule5.adoquery_xy.Prepared:=true;
datamodule5.adoquery_xy.ExecSQL;
end;
//when 后的汉字我已加了""

解决方案 »

  1.   

    create table 表1
     (姓名 char(10),
      职称 char(10),
      系别 char(10)
      )
    insert into 表1
    select 'aaa','教授','数学系'
    union
    select 'bbb','副教授','物理系'
    union
    select 'ccc','硕士','数学系'
    union
    select 'ddd','研究生','物理系'
    union
    select 'eee','副教授','数学系'
    union
    select 'fff','教授','物理系'
    union
    select 'ggg','教授','数学系'
    goDECLARE @SQL VARCHAR(8000) 
    SET @SQL='SELECT 系别, count(职称) as 总计' 
    SELECT @SQL= @SQL+ ',sum(CASE WHEN 职称 = ''' + 职称 + ''' THEN 1 else 0 END) [' + 职称 + ']' FROM (SELECT DISTINCT 职称 FROM 表1) A 
    SET @SQL=@SQL+ ' FROM 表1 GROUP BY 系别' 
    EXEC (@SQL) drop table 表1
      

  2.   

    whbo (王红波) 是不是贵阳的呀?
      

  3.   

    DECLARE @SQL VARCHAR(8000) 
    SET @SQL='SELECT 系别, count(职称) as 总计' 
    SELECT @SQL= @SQL+ ',sum(CASE WHEN 职称 = ''' + 职称 + ''' THEN 1 else 0 END) [' + 职称 + ']' FROM (SELECT DISTINCT 职称 FROM 表1) A 
    SET @SQL=@SQL+ ' FROM 表1 GROUP BY 系别' 
    EXEC (@SQL) 和普通的查询语句一样用
      

  4.   

    还是不太懂,就这句动态sql就能按系别统计?
    sum(CASE WHEN 职称 = ''' + 职称 + ''' THEN 1 else 0 END)这样对每个职称的值都运算?
      

  5.   

    拜托你去测试--打开你的查询分析器执行一下create table 表1
     (姓名 char(10),
      职称 char(10),
      系别 char(10)
      )
    insert into 表1
    select 'aaa','教授','数学系'
    union
    select 'bbb','副教授','物理系'
    union
    select 'ccc','硕士','数学系'
    union
    select 'ddd','研究生','物理系'
    union
    select 'eee','副教授','数学系'
    union
    select 'fff','教授','物理系'
    union
    select 'ggg','教授','数学系'
    goDECLARE @SQL VARCHAR(8000) 
    SET @SQL='SELECT 系别, count(职称) as 总计' 
    SELECT @SQL= @SQL+ ',sum(CASE WHEN 职称 = ''' + 职称 + ''' THEN 1 else 0 END) [' + 职称 + ']' FROM (SELECT DISTINCT 职称 FROM 表1) A 
    SET @SQL=@SQL+ ' FROM 表1 GROUP BY 系别' 
    EXEC (@SQL) drop table 表1
      

  6.   

    〉〉sum(CASE WHEN 职称 = ''' + 职称 + ''' THEN 1 else 0 END)这样对每个职称的值都运算?你少看了很多东西print 一下下面变量的值,你就知道了
    SELECT @SQL= @SQL+ ',sum(CASE WHEN 职称 = ''' + 职称 + ''' THEN 1 else 0 END) [' + 职称 + ']' FROM (SELECT DISTINCT 职称 FROM 表1) A