sql語法可有簡化一行? |
尚未結案
|
chubby
一般會員 發表:43 回覆:65 積分:21 註冊:2003-05-13 發送簡訊給我 |
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 發送簡訊給我 |
依您的需求,應是想將二段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 發送簡訊給我 |
例如 : 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 發送簡訊給我 |
[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 發送簡訊給我 |
謝謝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 發送簡訊給我 |
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
引言: [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 發送簡訊給我 |
|
chubby
一般會員 發表:43 回覆:65 積分:21 註冊:2003-05-13 發送簡訊給我 |
版主您好
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 發送簡訊給我 |
引言: 版主您好 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 發送簡訊給我 |
[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秒)
以上為小弟用碼錶測出報告,提供大家參考
謝謝大家指導
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |