รบกวนสอบถามเรื่องฟังก์ชั่น DSum
กระทู้เก่าบอร์ด อ.Yeadram

 1,686   9
URL.หัวข้อ / URL
รบกวนสอบถามเรื่องฟังก์ชั่น DSum

รบกวนสอบถามค่ะ ต้องการหาผลรวมสะสมทีละวันโดยสะสมไปเรื่อยๆ จนกว่าจะไม่มีข้อมูล
แต่ลองเขียนQuery ดูแล้ว คอลัมน์ CumCondy ผลรวมสะสมไม่ต่อเนื่องกันพอเริ่มเดือนใหม่ก็จะสะสมผลรวมใหม่ ไม่เอาผลรวมสะสมของเดือนที่แล้วมาคำนวณด้วย ไม่ทราบว่าจะแก้ไขอย่างไรดีคะให้สามารถหาผลรวมสะสมทั้งหมดของ AT-01โดยสะสมทีละวันไปเรื่อยๆ     
ตย. ที่เขียนค่ะ
DSum("Cony","DAILY_PROD","DatePart('d', [SDATE])<=" & [FDate] & " And DatePart('m', [SDATE]) = " & [AMonth] & " And DatePart('yyyy',[SDATE]) =" & [AYear] & " And NAME='" & [NAME] & "'" & "") AS CumCondy

NAME     SDATE     FDate AMonth     AYear      Condy     CumCondy
AT-01     21-Apr-08     21     4     2008     0.484     0.484
AT-01     22-Apr-08     22     4     2008     1.089     1.573
AT-01     23-Apr-08     23     4     2008     0.497     2.07
AT-01     24-Apr-08     24     4     2008     1.635     3.705
AT-01     25-Apr-08     25     4     2008     1.626     5.331
AT-01     26-Apr-08     26     4     2008     1.572     6.903
AT-01     27-Apr-08     27     4     2008     1.568     8.471
AT-01     28-Apr-08     28     4     2008     1.614     10.085
AT-01     29-Apr-08     29     4     2008     0             10.085
AT-01     30-Apr-08     30     4     2008     1.248     11.333
AT-01     01-May-08     1     5     2008     2.504     2.504
AT-01     02-May-08     2     5     2008     0.325     2.829
AT-01     03-May-08     3     5     2008     0.079     2.908
AT-01     04-May-08     4     5     2008     1.929     4.837
AT-01     05-May-08     5     5     2008     0.793     5.63

ขอบคุณล่วงหน้าค่ะ

9 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R14071
สิ่งที่คุณผิดคือ
ตรง Month และ Year ใช้เครื่องหมาย = หมายความว่าต้องตรงเดือน+ตรงปี
เท่ากับว่า Sum ตามเดือน

สิ่งที่แนะนำคือ
มี SDate อยู่แล้ว ที่จริงก็ไม่น่าจะแยก FDate, AMonth, AYear ออกมาอีก - ผลที่ตามมาคือ กรณีของคุณสับสนว่าจะใช้ field ใดในการ query ซึ่งที่ถูกแล้วให้ SDate ได้เลย


สรุปใช้ตามนี้ครับ
DSum("Condy","DAILY_PROD","SDATE<= #" & [SDate] & "# And NAME='" & [NAME] & "'") as CumCondy
2 @R14075
ขอบคุณค่ะสำหรับคำแนะนำ ลองทำตามดูแล้วค่ะแต่ผลรวมสะสมยังไม่ถูกต้องค่ะ
1. วันที่ไม่มีข้อมูล (Condy) แต่มีผลรวมสะสม
2. วันที่ 1 ของเดือนถัดไปก็ยังไม่เอายอดรสะสมของเดือนที่แล้วมาสะสมด้วยค่ะ

NAME     SDATE      Condy     CumComdy
AT-01     03-Apr-08     0          0
AT-01     04-Apr-08     0          0
AT-01     05-Apr-08     0          16.17
AT-01     06-Apr-08     0           74.227
AT-01     07-Apr-08     0          110.201
AT-01     08-Apr-08     0           155.848
AT-01     09-Apr-08     0           178.314
AT-01     10-Apr-08     0            178.314
AT-01     11-Apr-08     0            178.314
AT-01     12-Apr-08     0            178.314
AT-01     13-Apr-08     0             0
AT-01     21-Apr-08     0.484     0.484
AT-01     22-Apr-08     1.089     1.573
AT-01     23-Apr-08     0.497     2.07
AT-01     24-Apr-08     1.635     3.705
AT-01     25-Apr-08     1.626     5.331
AT-01     26-Apr-08     1.572     6.903
AT-01     27-Apr-08     1.568     8.471
AT-01     28-Apr-08     1.614     10.085
AT-01     29-Apr-08     0             10.085
AT-01     30-Apr-08     1.248     11.333
AT-01     01-May-08     2.504      0
AT-01     01-May-08     0.325      0


มีวิธีอื่นไหมคะที่จะหาผลรวมสะสมของ AT-01 แบบทีละวัน ตอนนี้ที่คิดได้คือการใช้ DSum

ขอบคุณนะค่ะสำหรับคำตอบ
3 @R14078
ไม่เข้าใจครับ
ที่มา ที่ไป - ใช้ที่ไหน เป็น Form, Report
อะไรเป็นตัวกำหนดข้อมูล - มี table อื่นที่เกี่ยวข้องนอกจากนี้หรือไม่
ทำไม่มีข้อมูลที่วันที่ซ้ำกัน - สรุปว่าอะไรเป็น key ของ table หรือ ของ Query ที่ต้องการ ...
???
4 @R14080
ขอโทษค่ะอธิบายไม่ละเอียด

มีตารางเดียวค่ะ ชื่อ DAILY_PROD และ key ในตารางคือ NAME กับ SDATE ค่ะ ข้อมูล คือ Condy
ต้องการหาผลรวมสะสมของ Condy โดยมีเงื่อนไขว่า สะสมเฉพาะชื่อที่เหมือนกันและสะสมตามวันลงมาเรื่อยๆ โดยการเขียน Query ค่ะ
ที่ทำไปคือการใช้ Dsum แต่ยังไม่ถูกค่ะ ไม่รู้ว่ามีวิธีอื่นนอกจาก Dsum หรือเปล่า

ตัวอย่างข้อมูลค่ะ

NAME     SDATE           Condy
AT-01     01-May-08     2.504
AT-01     02-May-08     0.325
AT-01     03-May-08     0.079
AT-01     04-May-08     1.929
AT-01     05-May-08     0.793
AT-01     06-May-08     0
AT-01     07-May-08     0
AT-01     08-May-08     0
AT-01     09-May-08     2.995
AT-01     10-May-08     2.046
AT-02     01-May-08     7.336
AT-02     02-May-08     6.969
AT-02     03-May-08     6.512
AT-02     04-May-08     6.674
AT-02     05-May-08     7.576
AT-02     06-May-08     6.888
AT-02     07-May-08     6.794
AT-02     08-May-08     4.798
AT-02     09-May-08     5.712
AT-02     10-May-08     4.973
AT-01     01-May-08     2.504

ขอบคุณ และ ขอโทษอีกครั้งค่ะ
5 @R14086
1. รวมยอดเฉพาะที่ Name เหมือนกัน
2. รวมเฉพาะเดือนเดียวกัน (ปีก็น่าปีเดียวกันด้วยถูกไหม)

วิธีทำ ที่นึกออกคือการจำลองตารางขึ้นมาเปรียบเทียบกัน
- สร้างคิวรี่ใหม่เปล่าๆ ขึ้นมา
- นำโค๊ดนี้ใส่ในหน้า SQL View

SELECT A.Name, A.SDATE, A.AMonth, A.AYear, A.Condy, (SELECT Sum(B.Condy) FROM DAILY_PROD AS B WHERE ((B.AMonth =
A.AMonth) and (B.AYear = A.AYear) and (B.Name = A.Name) AND (B.SDATE <= A.SDATE))) AS CumCondy
FROM DAILY_PROD AS A;

- Run ดูครับว่าได้ตามที่ต้องการหรือไม่
6 @R14088
แต่ถ้าต้องการรวมสะสมที่ Name เหมือนกันอย่างเดียว
ก็เอาเงื่อนไข
((B.AMonth = A.AMonth) and (B.AYear = A.AYear) ออก
จะได้เป็น

SELECT A.Name, A.SDATE, A.aMonth, A.AYear, A.Condy, (SELECT Sum(B.Condy) FROM DAILY_PROD AS B WHERE (B.name = A.name) AND (B.SDATE <= A.SDATE)) AS CumCondy FROM DAILY_PROD AS A;

ลองปรับใช้ดูครับ
7 @R14089
ขอบคุณค่ะ ยังไม่ค่อยเข้าใจหลักการเท่าไหร่ แต่ลองทำแล้วรันออกมา ยังไม่ใช่ตามที่ต้องการ กำลังปรับแก้อยู่ค่ะ

ยกตัวอย่างที่ต้องการ   ตามลัมน์ CumCondy
ถ้าวันนี้เป็นวันที่ 1/6/2008 ก็ Sumสะสม ตั้งแต่ 1-3 /5/2008 และ 1/6/2008 ของ AT-01 จะได้ 3.908 Sumสะสมแบบนี้ทุกวันจนกว่าข้อมูลของ AT-01 จะหมด
แล้วถึงไปเริ่ม Sum สะสมของ AT-02 ใหม่

NAME     SDATE          Condy          CumCondy
AT-01     01-May-08     2.504     2.504
AT-01     02-May-08     0.325     2.829
AT-01     03-May-08     0.079     2.908
AT-01     01-Jun-08     1.000       3.908
AT-01     02-Jun-08     0.502     4.41
AT-02     01-May-08     7.336     7.336
AT-02     02-May-08     6.969     14.305
AT-02     03-May-08     6.512     20.817
AT-02     01-Jun-08     2.500       23.317
AT-02     02-Jun-08     1.600     24.917

ขอบคุณทุกคนมากๆค่ะ   เด๊๋ยวจะลองปรับแก้แล้วรันใหม่ดูค่ะ
8 @R14090
งั้นมันก็น่าจะเป็นแบบ R14088 คือ

SELECT A.Name, A.SDATE, A.aMonth, A.AYear, A.Condy, (SELECT Sum(B.Condy) FROM DAILY_PROD AS B WHERE (B.name = A.name) AND (B.SDATE <= A.SDATE)) AS CumCondy FROM DAILY_PROD AS A;

ไม่ถูกหรือครับ
9 @R14170
ลองทำตามคุณ TTT บอกแล้ว ทำได้แล้วค่ะ แต่ใช้เวลานานในการดึงข้อมูล

ขอบคุณ คุณTTT มากๆเลยค่ะ ได้ความรู้ใหม่ด้วย
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2949s