全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1498
推到 Plurk!
推到 Facebook!

如何制作如图所示报表

答題得分者是:Fishman
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-04 17:50:34 IP:222.184.xxx.xxx 未訂閱
图中所示,姓名一列,为数据表中字段医生姓名,熊XX和张三则为医生姓名字段的记录内容,图中所示西药费,中药费等,就是数据表中字段项目类型的记录内容。空格中所填的数字,例如52,是按这种查询统计出来的:就是数据表中所有的记录,医生姓名=张三、项目类型=其它费2,能满足这两个条件的记录,就SUM应收金额字段,结果就等于52,其它的格子中要满足各自相应的查询条件。
------
我的编程起步于ktop,我将永远支持ktop
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-04 18:11:25 IP:210.65.xxx.xxx 未訂閱
Hi ntjrr,    請參考以下文章加以修改:    http://delphi.ktop.com.tw/topic.php?topic_id=49969 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-04 22:10:22 IP:222.184.xxx.xxx 未訂閱
您所点的代码基本上和我要的功能差不多,但下列代码我不懂如何列,因为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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-05 08:50:46 IP:210.65.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-05 21:09:25 IP:222.184.xxx.xxx 未訂閱
我把它改成如下代码: 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-06 08:27:24 IP:210.65.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-06 17:42:32 IP:222.184.xxx.xxx 未訂閱
还是显示未指定的错误
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-06 21:41:55 IP:222.184.xxx.xxx 未訂閱
我仔细看了一下别人的软件,(不是看到源程序),仍然如我图中所示,用的控件是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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-07 22:21:34 IP:222.184.xxx.xxx 未訂閱
引言: 图中所示,姓名一列,为数据表中字段医生姓名,熊XX和张三则为医生姓名字段的记录内容,图中所示西药费,中药费等,就是数据表中字段项目类型的记录内容。空格中所填的数字,例如52,是按这种查询统计出来的:就是数据表中所有的记录,医生姓名=张三、项目类型=其它费2,能满足这两个条件的记录,就SUM应收金额字段,结果就等于52,其它的格子中要满足各自相应的查询条件。
经各位大大指点,自己再摸索了一番,有了一定的进步,但还没成功,我所搞的代码如下: ADOQuery1.SQL.Add('select sum(单项累计),医生姓名, 项目类型 from tb_sf group by 医生姓名,项目类型'); 效果如图: 我自己做的图和我想要的图有差别,但所有的数据我都取出来了,就是如何再使数据排列成第一幅图中的样子,请各位大大不吝指教!谢谢!
------
我的编程起步于ktop,我将永远支持ktop
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-08 13:41:58 IP:210.65.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-08 18:09:42 IP:222.184.xxx.xxx 未訂閱
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-09 08:19:06 IP:210.65.xxx.xxx 未訂閱
Hi ntjrr,    這種寫法是固定的,除非你動態於前端根據項目類型利用迴圈產生此段 SQL Command!     ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-07-09 11:48:11 IP:222.184.xxx.xxx 未訂閱
引言: Hi ntjrr, 這種寫法是固定的,除非你動態於前端根據項目類型利用迴圈產生此段 SQL Command! ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ---------------------------------- < face="Verdana, Arial, Helvetica"> 不知道动态取值的SQL命令如何写的?复杂吗?
------
我的编程起步于ktop,我将永远支持ktop
chinyu
高階會員


發表:12
回覆:157
積分:153
註冊:2002-06-14

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-07-09 17:47:11 IP:218.163.xxx.xxx 未訂閱
引言:
引言: 图中所示,姓名一列,为数据表中字段医生姓名,熊XX和张三则为医生姓名字段的记录内容,图中所示西药费,中药费等,就是数据表中字段项目类型的记录内容。空格中所填的数字,例如52,是按这种查询统计出来的:就是数据表中所有的记录,医生姓名=张三、项目类型=其它费2,能满足这两个条件的记录,就SUM应收金额字段,结果就等于52,其它的格子中要满足各自相应的查询条件。
经各位大大指点,自己再摸索了一番,有了一定的进步,但还没成功,我所搞的代码如下: ADOQuery1.SQL.Add('select sum(单项累计),医生姓名, 项目类型 from tb_sf group by 医生姓名,项目类型'); 效果如图: 我自己做的图和我想要的图有差别,但所有的数据我都取出来了,就是如何再使数据排列成第一幅图中的样子,请各位大大不吝指教!谢谢!
先看看你用的報表是否有此功能,像FASTREPORT就有這功能。
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-07-12 12:39:58 IP:210.65.xxx.xxx 未訂閱
Hi ntjrr,    Sorry !! 忘了 Access 有 Pivot 的功能,請參考以下討論:    http://delphi.ktop.com.tw/topic.php?topic_id=68456 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
系統時間:2024-04-29 5:42:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!