亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4689 | 回復(fù): 10
打印 上一主題 下一主題

大家?guī)兔λ伎家粋SQL邏輯,連續(xù)工作日的金額匯總問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2006-06-06 15:24 |只看該作者 |倒序瀏覽
有一個表journal,有交易金額(amt)、交易日期(date)、客戶賬號(acc)三個字段,需要在2005-1-1到2006-1-1這段時間內(nèi)統(tǒng)計出連續(xù)10個工作日內(nèi)交易金額累計超過100000元的客戶的賬號,這個SQL如何寫?我是寫ec程序時用到的,我想可以使用c語言和SQL配合來做這個事情,不過個人覺得又土又麻煩,誰能想出簡單些的方法?

論壇徽章:
0
2 [報告]
發(fā)表于 2006-06-06 15:46 |只看該作者
用存儲過程也可以實現(xiàn)。
foreach 日期 循環(huán) 用日期 between  rq and rq+9 按帳號分組統(tǒng)計,判斷,返回數(shù)據(jù)。

論壇徽章:
0
3 [報告]
發(fā)表于 2006-06-06 15:52 |只看該作者
有沒有辦法不用外部的循環(huán)來幫助實現(xiàn)呢?

論壇徽章:
0
4 [報告]
發(fā)表于 2006-06-06 17:18 |只看該作者
一條單純的sql語句不可能,
除非你寫個存儲過程再在sql里邊調(diào)用,
可讀性還不如ec,
效率方面不好說

論壇徽章:
0
5 [報告]
發(fā)表于 2006-06-06 17:35 |只看該作者
我就是要用ec程序呀,不用存儲過程,不過很麻煩。用ec的話看誰想得出簡單的法子。

論壇徽章:
0
6 [報告]
發(fā)表于 2006-06-06 20:31 |只看該作者
用4GL來寫不是更好嗎?

論壇徽章:
0
7 [報告]
發(fā)表于 2006-06-07 09:24 |只看該作者
我在這里必須用ec來寫

論壇徽章:
0
8 [報告]
發(fā)表于 2006-06-07 11:27 |只看該作者
原帖由 forest077 于 2006-6-6 15:24 發(fā)表
有一個表journal,有交易金額(amt)、交易日期(date)、客戶賬號(acc)三個字段,需要在2005-1-1到2006-1-1這段時間內(nèi)統(tǒng)計出連續(xù)10個工作日內(nèi)交易金額累計超過100000元的客戶的賬號,這個SQL如何寫?我是寫ec程序時用到的,我想可以使用c語言和SQL配合來做這個事情,不過個人覺得又土又麻煩,誰能想出簡單些的方法?

連續(xù)10個工作日內(nèi)交易金額累計

工作日如何定義?如果和自然日不同就麻煩了

不過個人覺得又土又麻煩,誰能想出簡單些的方法?

你把自己的方法列一下,別人才能比較出思路是否比你的簡單些

論壇徽章:
0
9 [報告]
發(fā)表于 2006-06-07 11:51 |只看該作者
也行,我把現(xiàn)在自己的代碼貼一下,為了方便大家閱讀,我盡量簡化。工作日就是自然日。ec代碼如下:
EXEC SQL select * from 原始表 where 1<>1 into temp 結(jié)果表;//創(chuàng)建結(jié)果表
for ( lDate=開始日期 ; lDate<結(jié)束日期-10 ; lDate++ )        //從開始日期到結(jié)束日期循環(huán)
{
        EXEC SQL select unique * from 原始表
                where date between :lDate and :lDate+10
                and 其他搜索條件
                into temp tmp_r;        //選取出時間區(qū)間內(nèi)某10天的所有符合條件的記錄
        EXEC SQL select sum(amt) as sumamt,acc
                from tmp_r
                group by acc
                into temp tmp_r1;        //把每個賬號這段時間內(nèi)的交易金額匯總
        EXEC SQL insert into 結(jié)果表
                select * from tmp_r
                where acc in
                        (select acc from tmp_r1
                        where sumamt>=100000);        //取出金額總數(shù)大于100000的記錄放進(jìn)結(jié)果表
        EXEC SQL drop table tmp_r;
        EXEC SQL drop table tmp_r1;
}
這樣的缺點是,在結(jié)果表中就會存在很多重復(fù)的記錄,比如有一個交易單筆金額超過100000,那么用這個方法就會在結(jié)果表中重復(fù)10次,在數(shù)據(jù)量大時這是很不劃算的。
ikb有何高見?請指教,謝謝。

論壇徽章:
0
10 [報告]
發(fā)表于 2006-06-07 12:16 |只看該作者
我沒有高見,
只有討論。

1.既然結(jié)果只需要帳號,為了避免重復(fù),可以考慮先挑出唯一帳號
  declare cur cursor for select distinct acc from journal
   不知道有沒有可能同一帳號同一天可能進(jìn)行多筆交易,可能的話 帳號數(shù) 遠(yuǎn)小于 journal 中的記錄總數(shù),這個 distinct 應(yīng)該效率不低。當(dāng)然之前還可以考慮做一些預(yù)處理以加快效率,譬如某acc在journal中記錄總數(shù)小于10的可以不用考慮等等

2.在 fetch cur into :acctmp 的循環(huán)中嵌套 你所列的從開始日期到結(jié)束日期的循環(huán),對于循環(huán)來說,最重要的是添加判斷條件,及早跳出循環(huán),這樣效率才高。
   for ( lDate = 開始日期 ; lDate <= 結(jié)束日期 - 9 ; lDate++  )  
   {
       select sum(amt)
       into :sumamt
       from journal
       where acc = :acctmp
       and date between :lDate and :lDate + 9

       if ( sumamt >= 100000)
          將滿足條件的acc插入臨時表,并跳出本層循環(huán),繼續(xù)下一個賬號
   }
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP