如何制作如图所示报表 |
答題得分者是:Fishman
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi ntjrr, 請參考以下文章加以修改: http://delphi.ktop.com.tw/topic.php?topic_id=49969 ----------------------------------
小弟才疏學淺,若有謬誤尚請不吝指教
----------------------------------
------
Fishman |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
您所点的代码基本上和我要的功能差不多,但下列代码我不懂如何列,因为ADOQUERY我平时用的是一行,现在分了这么多行,我就无法运行了。另外一个问题,现在每行好合计,不知道能否将每一列再合计一下的?
SELECT MA015,
SUM(CASE WHEN DD <= 30 THEN SUMDATA ELSE 0 END) SUM30,
SUM(CASE WHEN DD > 30 AND DD <= 60 THEN SUMDATA ELSE 0 END) SUM60,
SUM(CASE WHEN DD > 60 AND DD <= 90 THEN SUMDATA ELSE 0 END) SUM90,
SUM(CASE WHEN DD > 90 AND DD <= 180 THEN SUMDATA ELSE 0 END) SUM180,
SUM(CASE WHEN DD > 180 AND DD <= 270 THEN SUMDATA ELSE 0 END) SUM270,
SUM(CASE WHEN DD > 270 AND DD <= 365 THEN SUMDATA ELSE 0 END) SUM365,
SUM(CASE WHEN DD > 365 THEN SUMDATA ELSE 0 END) SUMOTHERS,
SUM(SUMDATA) TOTAL
FROM TABLE1
GROUP BY
MA015
------
我的编程起步于ktop,我将永远支持ktop |
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi ntjrr,
1.在 ADOQuery1 的 SQL 屬性中,開啟其 SQL 屬性,將 SQL Command 貼上,按下 OK 即可,或是將多行改為一行也可以,也可以使用下述語法,逐一加入 procedure TForm1.Button1Click(Sender: TObject); begin ADOQuery1.Close ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT MA015,'); ADOQuery1.SQL.Add(' SUM(CASE WHEN DD <= 30 THEN SUMDATA ELSE 0 END) SUM30,'); ADOQuery1.SQL.Add(' SUM(CASE WHEN DD > 30 AND DD <= 60 THEN SUMDATA ELSE 0 END) SUM60,'); ADOQuery1.SQL.Add(' SUM(CASE WHEN DD > 60 AND DD <= 90 THEN SUMDATA ELSE 0 END) SUM90,'); ADOQuery1.SQL.Add(' SUM(CASE WHEN DD > 90 AND DD <= 180 THEN SUMDATA ELSE 0 END) SUM180,'); ADOQuery1.SQL.Add(' SUM(CASE WHEN DD > 180 AND DD <= 270 THEN SUMDATA ELSE 0 END) SUM270,'); ADOQuery1.SQL.Add(' SUM(CASE WHEN DD > 270 AND DD <= 365 THEN SUMDATA ELSE 0 END) SUM365,'); ADOQuery1.SQL.Add(' SUM(CASE WHEN DD > 365 THEN SUMDATA ELSE 0 END) SUMOTHERS,'); ADOQuery1.SQL.Add(' SUM(SUMDATA) TOTAL'); ADOQuery1.SQL.Add('FROM TABLE1'); ADOQuery1.SQL.Add('GROUP BY'); ADOQuery1.SQL.Add(' MA015'); ADOQuery1.Open; end; 2.若只是要用報表,可考慮使用 Group 來自行產生總計,或是也可以使用 union all 一筆 Total SELECT MA015, SUM(CASE WHEN DD <= 30 THEN SUMDATA ELSE 0 END) SUM30, SUM(CASE WHEN DD > 30 AND DD <= 60 THEN SUMDATA ELSE 0 END) SUM60, SUM(CASE WHEN DD > 60 AND DD <= 90 THEN SUMDATA ELSE 0 END) SUM90, SUM(CASE WHEN DD > 90 AND DD <= 180 THEN SUMDATA ELSE 0 END) SUM180, SUM(CASE WHEN DD > 180 AND DD <= 270 THEN SUMDATA ELSE 0 END) SUM270, SUM(CASE WHEN DD > 270 AND DD <= 365 THEN SUMDATA ELSE 0 END) SUM365, SUM(CASE WHEN DD > 365 THEN SUMDATA ELSE 0 END) SUMOTHERS, SUM(SUMDATA) TOTAL FROM TABLE1 GROUP BY MA015 UNION ALL SELECT '總計' AS MA015, SUM(CASE WHEN DD <= 30 THEN SUMDATA ELSE 0 END) SUM30, SUM(CASE WHEN DD > 30 AND DD <= 60 THEN SUMDATA ELSE 0 END) SUM60, SUM(CASE WHEN DD > 60 AND DD <= 90 THEN SUMDATA ELSE 0 END) SUM90, SUM(CASE WHEN DD > 90 AND DD <= 180 THEN SUMDATA ELSE 0 END) SUM180, SUM(CASE WHEN DD > 180 AND DD <= 270 THEN SUMDATA ELSE 0 END) SUM270, SUM(CASE WHEN DD > 270 AND DD <= 365 THEN SUMDATA ELSE 0 END) SUM365, SUM(CASE WHEN DD > 365 THEN SUMDATA ELSE 0 END) SUMOTHERS, SUM(SUMDATA) TOTAL FROM TABLE1---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
我把它改成如下代码:
begin
ADOQuery1.Close
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT 医生姓名,');
ADOQuery1.SQL.Add(' SUM(CASE WHEN 项目类型=西药费 THEN 应收金额 ELSE 0 END) 西药费,');
ADOQuery1.SQL.Add(' SUM(应收金额) TOTAL');
ADOQuery1.SQL.Add('FROM TABLE1');
ADOQuery1.SQL.Add('GROUP BY');
ADOQuery1.SQL.Add(' 医生姓名');
ADOQuery1.Open;
end;
编绎时是可以的,但运行软件该功能时,提示未指定的错误
------
我的编程起步于ktop,我将永远支持ktop |
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi ntjrr, 修改如下:
begin ADOQuery1.Close ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT 醫生姓名,'); ADOQuery1.SQL.Add(' SUM(CASE WHEN 項目類型=' QuotedStr('西藥費') ' THEN 應收金額 ELSE 0 END) 西藥費,'); ADOQuery1.SQL.Add(' SUM(應收金額) TOTAL'); ADOQuery1.SQL.Add('FROM TABLE1'); ADOQuery1.SQL.Add('GROUP BY'); ADOQuery1.SQL.Add(' 醫生姓名'); ADOQuery1.Open; end;發表人 -
------
Fishman |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
我仔细看了一下别人的软件,(不是看到源程序),仍然如我图中所示,用的控件是stringGrid,其中第一列为医生名,是从数据表A中取得,第一行为西药费、中药费等,是从数据表B中取得,(数据表A和B中都只有一个字段),中间空白格子中的数据是从数据表C中取得,假设数据表C中有三个字段,分别是1、2、3,那么格子中的数据的来源就是,当数据表C中某个记录满足如下条件:字段1=第一列中某个医生名,字段2=第一行中某个类型名,然后SUM(字段3)这个值就是格子中的数据。数据表A和B中的记录有变化时,那个STRINGGRID再次统计时行和列数也就相应有变化了。
------
我的编程起步于ktop,我将永远支持ktop |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
引言: 图中所示,姓名一列,为数据表中字段医生姓名,熊XX和张三则为医生姓名字段的记录内容,图中所示西药费,中药费等,就是数据表中字段项目类型的记录内容。空格中所填的数字,例如52,是按这种查询统计出来的:就是数据表中所有的记录,医生姓名=张三、项目类型=其它费2,能满足这两个条件的记录,就SUM应收金额字段,结果就等于52,其它的格子中要满足各自相应的查询条件。经各位大大指点,自己再摸索了一番,有了一定的进步,但还没成功,我所搞的代码如下: ADOQuery1.SQL.Add('select sum(单项累计),医生姓名, 项目类型 from tb_sf group by 医生姓名,项目类型'); 效果如图: 我自己做的图和我想要的图有差别,但所有的数据我都取出来了,就是如何再使数据排列成第一幅图中的样子,请各位大大不吝指教!谢谢!
------
我的编程起步于ktop,我将永远支持ktop |
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi ntjrr, Sorry !! 上述語法為 SQL Server 上用的,並不適用於 Access 上 以下 Sample 用 Access 為 DB,你參考看看 http://delphi.ktop.com.tw/loadfile.php?TOPICID=23345744&CC=522116
select dr_name, sum(iif(item = 'item1',amt,0)) as item1, sum(iif(item = 'item2',amt,0)) as item2, sum(iif(item = 'item3',amt,0)) as item3, sum(iif(item = 'item4',amt,0)) as item4, sum(iif(item = 'item5',amt,0)) as item5, sum(iif(item = 'item6',amt,0)) as item6, sum(iif(item = 'item7',amt,0)) as item7, sum(iif(item = 'item8',amt,0)) as item8, sum(iif(item = 'item9',amt,0)) as item9, sum(amt) as total from tb_sf group by dr_name union all select '合計' as dr_name, sum(iif(item = 'item1',amt,0)) as item1, sum(iif(item = 'item2',amt,0)) as item2, sum(iif(item = 'item3',amt,0)) as item3, sum(iif(item = 'item4',amt,0)) as item4, sum(iif(item = 'item5',amt,0)) as item5, sum(iif(item = 'item6',amt,0)) as item6, sum(iif(item = 'item7',amt,0)) as item7, sum(iif(item = 'item8',amt,0)) as item8, sum(iif(item = 'item9',amt,0)) as item9, sum(amt) as total from tb_sf---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman |
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
fishman大大,您的指点已经实现了我所要的功能。我想再问一下,在该代码中:
sum(iif(item = 'item1',amt,0)) as item1,
sum(iif(item = 'item2',amt,0)) as item2,
sum(iif(item = 'item3',amt,0)) as item3,
sum(iif(item = 'item4',amt,0)) as item4,
sum(iif(item = 'item5',amt,0)) as item5,
sum(iif(item = 'item6',amt,0)) as item6,
sum(iif(item = 'item7',amt,0)) as item7,
sum(iif(item = 'item8',amt,0)) as item8,
sum(iif(item = 'item9',amt,0)) as item9,
其中9个item能否设为动态的?也就是说您的表中tb_item中有该九个项目,如果该表中的项目名变化了,那么查询表中的也能相应改自动改变,例如item1被删掉了,那么查询时就自动查8个了,(当然通过手工删除查询中第一行代码就行了,我问的是有何方法在查询时就是自动取该表中内容,用不着以后手工改)谢谢!
------
我的编程起步于ktop,我将永远支持ktop |
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
|
ntjrr
高階會員 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
chinyu
高階會員 發表:12 回覆:157 積分:153 註冊:2002-06-14 發送簡訊給我 |
引言:先看看你用的報表是否有此功能,像FASTREPORT就有這功能。引言: 图中所示,姓名一列,为数据表中字段医生姓名,熊XX和张三则为医生姓名字段的记录内容,图中所示西药费,中药费等,就是数据表中字段项目类型的记录内容。空格中所填的数字,例如52,是按这种查询统计出来的:就是数据表中所有的记录,医生姓名=张三、项目类型=其它费2,能满足这两个条件的记录,就SUM应收金额字段,结果就等于52,其它的格子中要满足各自相应的查询条件。经各位大大指点,自己再摸索了一番,有了一定的进步,但还没成功,我所搞的代码如下: ADOQuery1.SQL.Add('select sum(单项累计),医生姓名, 项目类型 from tb_sf group by 医生姓名,项目类型'); 效果如图: 我自己做的图和我想要的图有差别,但所有的数据我都取出来了,就是如何再使数据排列成第一幅图中的样子,请各位大大不吝指教!谢谢! |
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi ntjrr, Sorry !! 忘了 Access 有 Pivot 的功能,請參考以下討論: http://delphi.ktop.com.tw/topic.php?topic_id=68456 ----------------------------------
小弟才疏學淺,若有謬誤尚請不吝指教
----------------------------------
------
Fishman |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |