SQL查询语法 |
答題得分者是:malanlk
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
一段代码如下:
begin adoquery1.Close; adoquery1.SQL.Clear; adoquery1.SQL.Text:='select 医生姓名,' ' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,' ' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,' ' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,' ' sum(单项累计) as total' ' from tb_sf' ' where (收费日期 between :d1 and :d2)' ' group by 医生姓名' ' union all' ' select "合計" as 医生姓名,' ' sum(iif(项目类型 = "西药费",单项累计,0)) as 西药费,' ' sum(iif(项目类型 = "中成药费",单项累计,0)) as 中成药费,' ' sum(iif(项目类型 = "中草药费",单项累计,0)) as 中草药费,' ' sum(单项累计) as total' ' from tb_sf' ' where (收费日期 between :d3 and :d4)' ;数据库为ACCESS 目前有一个问题,就是项目类型要预先写入,能否不预先写入,从数据表中的项目类型中自动统计呢,只要有不同的项目类型就统计出来,也就是起到groupy by的作用。另一个方法也可以,也就是从另一个表中取值(取出项目类型名称)里面有什么项目就在上面统计什么项目。 总的一点是要求灵活变动,不象上面预先写好了,万一别人项目改变了,就统计不出了。 發表人 - ntjrr 於 2005/11/13 18:08:44
------
我的编程起步于ktop,我将永远支持ktop |
kgt
高階會員 ![]() ![]() ![]() ![]() 發表:17 回覆:308 積分:165 註冊:2002-03-13 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
kgt
高階會員 ![]() ![]() ![]() ![]() 發表:17 回覆:308 積分:165 註冊:2002-03-13 發送簡訊給我 |
|
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
既然項目內容是有限且可以事先知道的
那就先將項目名稱選出來, 再從 SQL 下手
ss := ''; adoquery1.SQL.Clear; adoquery1.SQL.Text:='select 項目名稱 from 項目表格'; adoquery1.Open; while not adoquery1.Eof do begin ss := ss Format(' sum(iif(項目類型 = "%s",單項累計,0)) as %s,',[adoquery1.Fields[0].AsString,adoquery1.Fields[0].AsString]); adoquery1.Next; end; if (ss<>'') then ss := StuffString(ss,Length(ss),1,' '); // 將最後一個 ',' 換成空白 adoquery1.Close; adoquery1.SQL.Clear; adoquery1.SQL.Text:='select 醫生姓名,' ss .... ' union all' ' select "合計" as 醫生姓名,' ss .... |
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
我将代码改写到我的软件中如下:
begin ss:=''; ADOQuery3.Close; ADOQuery3.SQL.Text:='select lx from tb_yplx'; ADOQuery3.Open ; while not ADOQuery3.Eof do begin ss:= ss + Format(' sum(iif(lx = ''%s'',单项累计,0)) as %s,',[adoquery3.Fields[0].AsString,adoquery3.Fields[0].AsString]); ADOQuery3.Next; end; if (ss<>'') then ss := StuffString(ss,Length(ss),1,' '); // 將最後一個 ',' 換成空白 ADOQuery3.Close; ADOQuery3.SQL.Text:='select 医生姓名,' +' ss' +' sum(单项累计) as total' +'from tb_sf group by 医生姓名' +'union all' +' select 合计 as 医生姓名' +' ss' +' sum(单项累计) as total' +'from tb_sf '; ADOQuery3.Open; end;出错如下:
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
var ss:string; begin ss:=''; ADOQuery3.Close; ADOQuery3.SQL.Clear; ADOQuery3.SQL.Text:='select lx from tb_yplx'; ADOQuery3.Open ; while not ADOQuery3.Eof do begin ss:= ss + Format(' sum(iif(项目类型= ''%s'',单项累计,0)) as %s,',[adoquery3.Fields[0].AsString,adoquery3.Fields[0].AsString]); ADOQuery3.Next; end; if (ss<>'') then ss := StuffString(ss,Length(ss),1,' '); // 將最後一個 ',' 換成空白 ADOQuery3.Close; ADOQuery3.SQL.Clear; ADOQuery3.SQL.Text:='select 医生姓名,' + ss +' sum(单项累计) as total' +' from tb_sf group by 医生姓名' +' union all' +' select ''合计'' as 医生姓名,' + ss +' sum(单项累计) as total' +' from tb_sf '; ADOQuery3.Open; end;出错如下:
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
|
ntjrr
高階會員 ![]() ![]() ![]() ![]() 發表:240 回覆:312 積分:110 註冊:2005-04-24 發送簡訊給我 |
最后的代码如下:
var ss:string; begin dbgrid1.DataSource.DataSet.DisableControls; ss:=''; adoquery1.Close; adoquery1.SQL.Clear; adoquery1.SQL.Text:='select lx from tb_yplx'; adoquery1.Open ; while not adoquery1.Eof do begin ss:= ss Format(' sum(iif(项目类型= ''%s'',单项累计,0)) as %s,',[adoquery1.Fields[0].AsString,adoquery1.Fields[0].AsString]); adoquery1.Next; end; // if (ss<>'') then // ss := StuffString(ss,Length(ss),1,' '); // 將最後一個 ',' 換成空白 adoquery1.Close; adoquery1.SQL.Clear; adoquery1.SQL.Text:='select 医生姓名,' ss ' sum(单项累计) as total' ' from tb_sf where 收费日期 between :d1 and :d2 group by 医生姓名 ' ' union all' ' select ''合计'' as 医生姓名,' ss ' sum(单项累计) as total' ' from tb_sf where 收费日期 between :d3 and :d4'; adoquery1.Parameters.ParamByName('d1').Value :=formatdatetime('yy-m-d',DateTimePicker1.Date); adoquery1.Parameters.ParamByName('d2').Value :=formatdatetime('yy-m-d',DateTimePicker2.Date); adoquery1.Parameters.ParamByName('d3').Value :=formatdatetime('yy-m-d',DateTimePicker1.Date); adoquery1.Parameters.ParamByName('d4').Value :=formatdatetime('yy-m-d',DateTimePicker2.Date); ADOQuery1.Open; adoquery1.FieldByName('医生姓名').DisplayWidth:=10; dbgrid1.DataSource.DataSet.EnableControls;麻烦前辈过目,感谢malanlk前辈在百忙之中能应邀抽空前来本站指点小弟!
------
我的编程起步于ktop,我将永远支持ktop |
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |