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

SQL查询语法

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-13 18:05:22 IP:222.184.xxx.xxx 未訂閱
一段代码如下:  
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-13 20:01:38 IP:61.219.xxx.xxx 未訂閱
项目类型-->what mena? iif(项目类型 = "西药费",单项累计,0)) -->iif的定義是? sorry,我未用過ACCESS,所以要先了解您的基本定義。3Q...
ntjrr
高階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-13 20:32:17 IP:222.184.xxx.xxx 未訂閱
引言: 项目类型-->what mena? iif(项目类型 = "西药费",单项累计,0)) -->iif的定義是? sorry,我未用過ACCESS,所以要先了解您的基本定義。3Q...
项目类型是数据表中的一个栏位(字段)
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-14 15:51:29 IP:222.184.xxx.xxx 未訂閱
再换一个问法 也就是一个表中有如下字段,医生姓名、项目类型、金额 想用一个SQL查询出结果在DBGRID中显示 我上面的代码实现的功能只能够预先写入固定的项目类型名称,如中药费等,我要的功能是不预先写,表中有什么不同的项目类型就统计什么项目类型。
------
我的编程起步于ktop,我将永远支持ktop
kgt
高階會員


發表:17
回覆:308
積分:165
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-14 20:39:53 IP:61.219.xxx.xxx 未訂閱
作法和您最近問的一個問題 (【問題】如何從三張表中查詢出數據顯示在一起 )的解法雷同, 請您再自行試試看。
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-14 23:39:37 IP:61.219.xxx.xxx 未訂閱
既然項目內容是有限且可以事先知道的 那就先將項目名稱選出來, 再從 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-15 07:32:09 IP:222.184.xxx.xxx 未訂閱
我将代码改写到我的软件中如下:  
 
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;    
出错如下: 發表人 - ntjrr 於 2005/11/15 07:32:50
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-15 08:24:28 IP:203.69.xxx.xxx 未訂閱
是 ss 不是 ' ss'
ntjrr
高階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-15 12:19:44 IP:222.184.xxx.xxx 未訂閱
 
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-11-15 12:33:06 IP:203.69.xxx.xxx 未訂閱
ntjrr 大哥.... 麻煩您自己檢查一下 ss 字串的內容及最後組出來的Query字串是否正確... 可能是最後ㄧ個 "," 沒換掉...
ntjrr
高階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-15 14:15:42 IP:222.184.xxx.xxx 未訂閱
经过前辈的一句话点醒,我学着将SQL命令SHOW了出来,结果发现问题是出在了最后一个","的运用上,不过因为有一句 ' sum(单项累计) as total' 跟在后面所以我不是把这个“,”替换成空白,而是一定要加上,所以我就将//ss := StuffString(ss,Length(ss),1,' ');把这一行注解掉了,其它不变,结果运行成功了。其它我再试一下,不知道除了注解掉这一行其它要不要变化的?
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-11-15 14:49:35 IP:222.184.xxx.xxx 未訂閱
现在还有一个问题,就是在dbgrid中显示出来的医生姓名一栏很宽很宽,难看得很,后面的项目类型字段宽度正好。
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-11-15 14:49:40 IP:203.69.xxx.xxx 未訂閱
if (ss<>'') then 也要拿掉
ntjrr
高階會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-11-15 15:04:58 IP:222.184.xxx.xxx 未訂閱
if (ss<>'')这一行我去掉了 宽度我这样搞的,效果是可以的,不懂对不对 adoquery1.Open; adoquery1.FieldByName('医生姓名').DisplayWidth:=10;
------
我的编程起步于ktop,我将永远支持ktop
ntjrr
高階會員


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-11-15 15:28:32 IP:222.184.xxx.xxx 未訂閱
最后的代码如下:  
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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-11-15 15:37:05 IP:203.69.xxx.xxx 未訂閱
DisplayWidth 是用來設定這個欄位要顯示多少字元 假設 資料是 "1234567890" 而DisplayWidth=5, DBGrid 就會將寬度調整成只看的到 "12345"
系統時間:2024-08-18 18:36:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!