有这样的一段代码:
select 数量=count(*), 年份=2005 from jibenqingkuang where (xb='男' and datediff(year,cssj,'2005-1-1')=60) or  (xb='女' and datediff(year,cssj,'2005-1-1')=50 and ygxs like '%工%'其中年份与时间的'2005','2005-1-1'是动态变化的,如何生成形如如下的代码呢
select 数量=count(*), 年份=2005 from jibenqingkuang where (xb='男' and datediff(year,cssj,'2005-1-1')=60) or  (xb='女' and datediff(year,cssj,'2005-1-1')=50 and ygxs like '%工%'
 union
select 数量=count(*), 年份=2006 from jibenqingkuang where (xb='男' and datediff(year,cssj,'2006-1-1')=60) or  (xb='女' and datediff(year,cssj,'2006-1-1')=50 and ygxs like '%工%'
union
select 数量=count(*), 年份=2007 from jibenqingkuang where (xb='男' and datediff(year,cssj,'2007-1-1')=60) or  (xb='女' and datediff(year,cssj,'2007-1-1')=50 and ygxs like '%工%'
如输入2009则代码会依次类推union到2009年的时间

解决方案 »

  1.   

    要生成的如下形式
    edit1输入2005-1-1 ,edit2输入2008-12-31则会统计出如下数据
    数量    年份
    1000     2005
    1200     2006
    1100     2007
    1200     2008  
      

  2.   

    //函数
    function TForm1.GetUnionSQL(Year: Integer): String;
    const
    SQL = 'select 数量=count(*), 年份=%d from jibenqingkuang where (xb=''男'' '
        + 'and datediff(year,cssj,''%d-1-1'')=60) or  (xb=''女'' '
        + 'and datediff(year,cssj,''%d-1-1'')=50 and ygxs like ''%%工%%'' ';
    CLStr = #13#10;
    var
      Strtmp: string;
      i: Integer;
    begin
      Result := '';
      for i := 2005 to Year do
      begin
        if Result = '' then
          Result := Format(SQL, [i, i, i])
        else
          Result := Format('%s %s union %s ' + SQL , [Result, CLStr, CLStr, i, i, i])
      end;
    end;
    //调用
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Lines.Add( GetUnionSQL(2009) );
    end;//返回结果
    {select 数量=count(*), 年份=2005 from jibenqingkuang where (xb='男' and datediff(year,cssj,'2005-1-1')=60) or  (xb='女' and datediff(year,cssj,'2005-1-1')=50 and ygxs like '%工%'
     union 
     select 数量=count(*), 年份=2006 from jibenqingkuang where (xb='男' and datediff(year,cssj,'2006-1-1')=60) or  (xb='女' and datediff(year,cssj,'2006-1-1')=50 and ygxs like '%工%'  
     union 
     select 数量=count(*), 年份=2007 from jibenqingkuang where (xb='男' and datediff(year,cssj,'2007-1-1')=60) or  (xb='女' and datediff(year,cssj,'2007-1-1')=50 and ygxs like '%工%'  
     union 
     select 数量=count(*), 年份=2008 from jibenqingkuang where (xb='男' and datediff(year,cssj,'2008-1-1')=60) or  (xb='女' and datediff(year,cssj,'2008-1-1')=50 and ygxs like '%工%'  
     union 
     select 数量=count(*), 年份=2009 from jibenqingkuang where (xb='男' and datediff(year,cssj,'2009-1-1')=60) or  (xb='女' and datediff(year,cssj,'2009-1-1')=50 and ygxs like '%工%' 
    }