台灣最大程式設計社群網站
線上人數
1655
 
會員總數:246086
討論主題:189663
歡迎您免費加入會員
討論區列表 >> ASP >> SQL 改良
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
SQL 改良
價值 : 30 QP  點閱數:156 回應數:4
樓主

Alan Yuan
門外漢
0 13
761 31
發送站內信

各位師兄好,有勞指請教以下的 SQL,如何可以不用 For / Next ,使用 "子查詢" 組合成單一 SQL,令資料庫只需開啟一次,優化資源,謝謝各位師兄。

ReDim AnTotal(12)
For I = 1 to 12
SQL = "Select Sum(BSalary) As DDD From Invoice Where BStaff = 'ERI' And Month =" & I & " And Year = 2019 Group by Month"
Set rs = GetMdbRecordset( "BInvoice.mdb" , SQL)
AnTotal(I) = rs("DDD")
Next




搜尋相關Tags的文章: [ ASP SQL ] , [ ] ,
本篇文章發表於2020-09-08 03:17
1樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
SQL = "Select Month, Sum(BSalary) As DDD From Invoice Where BStaff = 'ERI' And Year = 2019 Group by Month"
這樣就能一次取回每個月的統計資料,不用跑12次
接下來只需跑迴圈把資料塞進陣列即可
do while not rs.eof
AnTotal(rs("Month")) = rs("DDD")
rs.MoveNext
loop
本篇文章回覆於2020-09-08 10:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Alan Yuan
檢舉此回應
成功了。謝謝師兄的指教。然而更進一步,BStaff 是變數,事先須求得各員工的名稱,再用師兄改良的公式,計算各人每月的總和。有沒有可能也合併到 SQL 裡 :

SQL = "Select BStaff From Invoice Where Year = 2019"
SQL = SQL & " Group by BStaff Order By BStaff"
Set rs = GetMdbRecordset( "BInvoice.mdb" , SQL)

While Not rs.EOF
If Len(StaffList) = 0 Then
StaffList = rs("BStaff")
Else
StaffList = StaffList & ", " & rs("BStaff")
End If
rs.movenext
Wend

StaffL = Split(StaffList, ", ")
For J = 0 to UBound(StaffL)
BStaff = StaffL(J)

SQL = "Select Month, Sum(BSalary) As DDD From Invoice Where BStaff = '" & BStaff & "' And Year = 2019 Group by Month"
Set rs = GetMdbRecordset( "BInvoice.mdb" , SQL)

Do While not rs.eof
AnTotal(rs("Month")) = rs("DDD")
rs.MoveNext
Loop
Next

感謝師兄的關注及指導。
本篇文章回覆於2020-09-08 13:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
最有價值解答

老頑童
捐贈 VP 給 老頑童 檢舉此回應
那就把BStaff也加到Group by堙A得到的就會是各員工,各月份的統計資料(可加Order by排序)
SQL = "Select BStaff, Month, Sum(BSalary) As DDD From Invoice Where Year = 2019 Group by BStaff, Month Order by BStaff, Month"

但之後的AnTotal必需再加判斷BStaff是不是同一人
不然資料會混在一起
本篇文章回覆於2020-09-08 14:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

Alan Yuan
檢舉此回應
非常感激前輩的提點, 我會依前輩的指教再努力嘗試, 感恩。
本篇文章回覆於2020-09-08 20:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.