具体一点,一般用sql语句的order by ,group by就可以了.

解决方案 »

  1.   

    再次提问:如何创建交叉统计报表。十万火急!!!!!!
    ghj1976可以具体点吗?
      

  2.   

        利用sql查出数据,再把数据填充到Tstringgrid中
        下面是我在给一个医院开发的门诊系统中的一个范列,可能有些垃圾.
       sql语句:
    SELECT KSXX."KSBM" as KSBM,YSXX."GH" as GH, YJKS."KSBM" as FPLB,sum( Sfhjmx."JE" )  as JE, MAX(KSXX."KSMC") as KSMC,MAX(YSXX."YSXM") as YSXM,MAX(YJKS."KSMC") as FPMC
    FROM "SFMXZ.DB" Sfmxz ,"Sfhjmx.DB" Sfhjmx ,
         "Hjsf.DB" Hjsf , "YSXX.DB" YSXX ,
         "KSXX.DB" KSXX,"KSXX.DB" YJKS,"JCXM.DB" JCXM
    WHERE ( YSXX.KSBM = KSXX.KSBM )  AND ( Sfhjmx.YSBM = YSXX.GH )
      AND ( Sfmxz.DJH = Hjsf.Hjsfh )  AND ( Sfhjmx.JCBM = JCXM.JCBM )
      AND ( JCXM.KSBM = YJKS.KSBM )  AND ( Sfmxz.SFLB = '划价' )
      AND ( Sfmxz.JZBZ = 'J' )  AND ( Sfhjmx.Hjsfh = Hjsf.Hjsfh )
      AND ( Sfmxz.RQ >= :QSRQ  )  AND ( Sfmxz.RQ <=:ZZRQ )
      AND ( Hjsf.TPBZ ='' ) 
    GROUP BY
      KSXX."KSBM" ,YSXX."GH",YJKS."KSBM"
    把数据写入Tstringgrid的代码:
    procedure TKSXYMXForm.FormActivate(Sender: TObject);
    var
      KSBM,YSBM : string;
      I, J: Integer;
      JEXJ , JEHJ : Double;
    begin
      KSYSXMQuery.ParamByName('QSRQ').AsDateTime := QSRQ;
      KSYSXMQuery.ParamByName('ZZRQ').AsDateTime := ZZRQ;
      KSYSXMQuery.Close;
      KSYSXMQuery.Open;
      if KSYSXMQuery.RecordCount < 1 then Exit;
      KSYSXMQuery.First;
      KSBM := '';
      YSBM := '';
      I := 1;
      StringGrid1.Cells[0,0] := '门诊科室';
      StringGrid1.Cells[1,0] := '医生-医技科室';
      while not KSYSXMQuery.Eof do begin
        if not ((KSBM = KSYSXMQuery.FieldByName('KSBM').AsString) and
               (YSBM = KSYSXMQuery.FieldByName('GH').AsString)) then
        begin
          if (I > 1) and (KSBM <> KSYSXMQuery.FieldByName('KSBM').AsString)then begin
             StringGrid1.RowCount := StringGrid1.RowCount +1;
             I := I + 1;
             StringGrid1.Cells[1,I-1] := '小计';
          end;
          StringGrid1.RowCount := StringGrid1.RowCount +1;
          I := I + 1;
          if not (KSBM = KSYSXMQuery.FieldByName('KSBM').AsString) then begin
             KSBM := KSYSXMQuery.FieldByName('KSBM').AsString;
             StringGrid1.Cells[0,I-1] := KSYSXMQuery.FieldByName('KSMC').AsString;
          end;
          if not (YSBM = KSYSXMQuery.FieldByName('GH').AsString) then begin
             YSBM := KSYSXMQuery.FieldByName('GH').AsString;
             StringGrid1.Cells[1,I-1] := KSYSXMQuery.FieldByName('YSXM').AsString;
          end;
        end;
        J := 2;
        while True do begin
          if StringGrid1.ColCount > J then begin
             if StringGrid1.Cells[J,0] = KSYSXMQuery.FieldByName('FPMC').AsString then begin
                StringGrid1.Cells[J,I-1] := FloatToMyStr(KSYSXMQuery.FieldByName('JE').AsFloat);
                Break;
             end;
          end
          else begin
                StringGrid1.ColCount := StringGrid1.ColCount + 1;
                StringGrid1.Cells[J,0] := KSYSXMQuery.FieldByName('FPMC').AsString;
                StringGrid1.Cells[J,I-1] := FloatToMYStr(KSYSXMQuery.FieldByName('JE').AsFloat);
                Break;
          end;
          J := J + 1;
        end;
        KSYSXMQuery.Next;
      end;
      StringGrid1.RowCount := StringGrid1.RowCount +1;
      I := I + 1;
      StringGrid1.Cells[1,I-1] := '小计';
      StringGrid1.RowCount := StringGrid1.RowCount +1;
      I := I + 1;
      StringGrid1.Cells[0,I-1] := '合计';
      StringGrid1.ColCount := StringGrid1.ColCount + 1;
      StringGrid1.Cells[StringGrid1.ColCount-1,0] := '合计';
      for J := 2 to StringGrid1.ColCount do begin
        JEHJ := 0;
        JEXJ := 0;
        for I := 1 to StringGrid1.RowCount do begin
            if not (StringGrid1.Cells[0,I] = '合计') then begin
               if StringGrid1.Cells[1,I] = '小计' then begin
                  StringGrid1.Cells[J,I] := FloatToMYStr(JEXJ);
                  JEHJ := JEHJ + JEXJ;
                  JEXJ := 0;
               end
               else if StringGrid1.Cells[J,I] <> '' then
                  JEXJ := JEXJ + StrToFloat(StringGrid1.Cells[J,I]);
            end
            else
                  StringGrid1.Cells[J,I] := FloatToMYStr(JEHJ);
        end;
      end;  for I := 1 to StringGrid1.RowCount do begin
        JEHJ := 0;
        for J := 2 to StringGrid1.ColCount do begin
          if (StringGrid1.Cells[J,0] = '合计') then begin
              StringGrid1.Cells[J,I] := FloatToMYStr(JEHJ);
          end
          else if StringGrid1.Cells[J,I] <> '' then
              JEHJ := JEHJ + StrToFloat(StringGrid1.Cells[J,I]);
        end;
      end;
      StringGrid1.FixedRows := 1;
      StringGrid1.FixedCols := 2;
    end;希望对你有帮助.
      

  3.   

    什么交叉统计报表?见没见过Decision Cube我想这才是你想要的,在Delphi企业版中找!