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

sql語法可有簡化一行?

尚未結案
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-01 09:51:34 IP:61.228.xxx.xxx 未訂閱
ADOQuery1.SQL.Clear; // 第1 ADOQuery1.SQL.Add('Select Sum(DLMoney) as DebitMoney from detailledge where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc ''' and DL_Type = ''' '1' ''' '); ADOQuery11.SQL.Clear; // 第2 ADOQuery11.SQL.Add('Select Sum(DLMoney) as LenderMoney from detailledge where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc ''' and DL_Type = ''' '2' ''' '); 可簡化一行SQL 嗎?
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-01 10:53:03 IP:61.60.xxx.xxx 未訂閱
依您的需求,應是想將二段SQL組成一段處理。個人建議,有錯請指正。 SELECT (SELECT Sum(DLMoney) FROM detailledge WHERE DlAccno= A.DlAccno AND DL_Type = ''1'' ) DebitMoney, (SELECT Sum(DLMoney) FROM detailledge WHERE DlAccno= A.DlAccno AND DL_Type = ''2'' ) LenderMoney , FROM detailledge A where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc '''' ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-01 18:05:30 IP:61.218.xxx.xxx 未訂閱
例如 : ADOQuery1.SQL.Add('Select DL_Type, Sum(DLMoney) as DebitMoney from detailledge where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc ''' and (DL_Type = ''1'' or DL_Type = ''2'' '); ADOQuery1.SQL.Add(' group by DL_Type ') ; 大致方向是這樣 我沒測試過 你在試試看 只要針對DL_Type做group 就可以了 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2004/09/01 18:25:15 發表人 - T.J.B 於 2004/09/01 18:25:58 發表人 - T.J.B 於 2004/09/01 18:28:51
------
天行健
君子當自強不息~~@.@
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-01 19:05:19 IP:61.228.xxx.xxx 未訂閱
[quote] 例如 : ADOQuery1.SQL.Add('Select DL_Type, Sum(DLMoney) as DebitMoney from detailledge where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc ''' and (DL_Type = ''1'' or DL_Type = ''2'' '); ADOQuery1.SQL.Add(' group by DL_Type ') ; 大致方向是這樣 我沒測試過 你在試試看 只要針對DL_Type做group 就可以了 嗨版主您好: Sum(DLMoney) as DebitMoney 取dl_type='1' 好像少了Sum(DLMoney) as LenderMoney 取dl_type='2' 謝謝版主
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-01 19:56:55 IP:61.228.xxx.xxx 未訂閱
謝謝likush, 修正一下可行,不過用此語法好像慢一些 用P4 2.4G PC(Access Database) ADOQuery1筆數13,197 ADOQuery2筆數462筆 ----------------------- 跑要花費 1分32秒 ADOQuery2.First; while not ADOQuery2.Eof do begin Acc:=InCome_ADOQuery2.FieldByName('heading').AsString; 一行sql語法 ADOQuery1.SQL.Add('Select (Select Sum(DLMoney) from detailledge where DlAccno = ''' Acc ''' and DL_Type = ''' '1' ''' ) as DebitMoney ,'); ADOQuery1.SQL.Add(' (Select Sum(DLMoney) from detailledge where DlAccno = ''' Acc ''' and DL_Type = ''' '2' ''' ) as LenderMoney '); ADOQuery1.SQL.Add(' From detailledge where DLDate >= ''' BD ''' and DLDate <= ''' ED ''' '); ADOQuery2.Next; ProgressBar1.StepIt; end; 如用2個ADOQuery run -------------------------- 花費時間1分鐘好像快些 ADOQuery1.SQL.Clear; // 第1 ADOQuery1.SQL.Add('Select Sum(DLMoney) as DebitMoney from detailledge where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc ''' and DL_Type = ''' '1' ''' '); ADOQuery11.SQL.Clear; // 第2 ADOQuery11.SQL.Add('Select Sum(DLMoney) as LenderMoney from detailledge where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc ''' and DL_Type = ''' '2' ''' '); 可有快一點嗎?謝謝
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-01 22:14:22 IP:218.163.xxx.xxx 未訂閱
不好意思,提供了不好的方法。 ^^" 若以ACCESS來說, 您亦可參考利用IF 如IIF(DL_Type = ''1'', 1,0)的方式 可出現你要的結果,但可能針對資料部份您仍需稍作處理,不知您這邊的需求是在於將二段SQL簡化即可,或針對效率方面,您亦可參考用THREAD的方式。 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-01 23:33:25 IP:218.160.xxx.xxx 未訂閱
引言: [quote] 例如 : ADOQuery1.SQL.Add('Select DL_Type, Sum(DLMoney) as DebitMoney from detailledge where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc ''' and (DL_Type = ''1'' or DL_Type = ''2'' )');<---就是這個阿 ADOQuery1.SQL.Add(' group by DL_Type ') ; 大致方向是這樣 我沒測試過 你在試試看 只要針對DL_Type做group 就可以了 嗨版主您好: Sum(DLMoney) as DebitMoney 取dl_type='1' 好像少了Sum(DLMoney) as LenderMoney 取dl_type='2' 謝謝版主
你取出的sum(DLMoney) 所代表的都是同一個欄位吧 只是別名不一樣 天行健 君子當自強不息~~@.@ 發表人 - t.j.b 於 2004/09/01 23:39:07
------
天行健
君子當自強不息~~@.@
shpeng
初階會員


發表:6
回覆:67
積分:49
註冊:2002-12-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-02 08:26:10 IP:61.219.xxx.xxx 未訂閱
select ,SUM(CASE WHEN DL_Type = 1 THEN DLMoney ELSE 0 END) as sum_1 ,SUM(CASE WHEN DL_Type = 2 THEN DLMoney ELSE 0 END) as sum_2 from xx ==取之於斯,用之於斯==
------
==取之於斯,用之於斯==
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-02 17:48:45 IP:61.228.xxx.xxx 未訂閱
版主您好 ADOQuery1.SQL.Add('Select DL_Type, Sum(DLMoney) as DebitMoney from detailledge where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc ''' and (DL_Type = ''1'' or DL_Type = ''2'' '); ADOQuery1.SQL.Add(' group by DL_Type ') ; 此語法RUN會有Error 我想到一個方法 select * into test ..... 暫存,然後再去Sum(....時間好像比較快些) 我的想法不知是否對,否則Sum時間蠻耗時 另外我去跑ms-sql看看會比access慢嗎?在告訴各位結果 謝謝大家
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-03 10:27:28 IP:61.218.xxx.xxx 未訂閱
引言: 版主您好 ADOQuery1.SQL.Add('Select DL_Type, Sum(DLMoney) as DebitMoney from detailledge where DLDate >= ''' BD ''' and DLDate = ''' ED ''' and DlAccno = ''' Acc ''' and (DL_Type = ''1'' or DL_Type = ''2'') ');<---要多一個括號 ADOQuery1.SQL.Add(' group by DL_Type ') ; 此語法RUN會有Error 我想到一個方法 select * into test ..... 暫存,然後再去Sum(....時間好像比較快些) 我的想法不知是否對,否則Sum時間蠻耗時 也是可以啦 另外我去跑ms-sql看看會比access慢嗎?在告訴各位結果 謝謝大家
天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-09-04 09:14:48 IP:61.228.xxx.xxx 未訂閱
[A]Access 資料庫使用SQL語法Select sum(a),sum(b) ....where ... 比較費時(筆數4000 50 秒) [B] 如先取 select * into tmpa from ... where dldate >= bd and dldate <=ed 再用do while 去run while not adoquery2.eof do begin x:=x a; z:=z b adoquery1.next end; // 用此法Acess超快 (15秒) 使用sql-2000 [A]方法比較快(耗15秒),反而[B]比較慢一些(耗28秒) 以上為小弟用碼錶測出報告,提供大家參考 謝謝大家指導
系統時間:2024-05-17 13:26:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!