เรื่อง Running Sum ใน Query
กระทู้เก่าบอร์ด อ.Yeadram

 8,774   17
URL.หัวข้อ / URL
เรื่อง Running Sum ใน Query

จะขอสอบถามเกี่ยวกับ Query ค่ะ เราสามารถระบุใน Query ให้ทำการ Running Sum (แบบ Over Group หรือ Over All) เหมือนกับใน Report ได้หรือไม่ค่ะ เนื่องจากจะต้องทำการ Running Sum ใน Query เพื่อนำข้อมูลไปใช้ในอีก Query หนึ่งก่อนแล้วจึงจะสามารถทำเป็น Report ได้ค่ะ ยกตัวอย่างข้อมูล

ใน Query ให้แสดงข้อมูลตามด้านล่าง โดยช่อง "รวม" ให้ทำการ Running Sum (Over Group) แยกรวมตามรหัส และเรียงข้อมูลตามวันที่จากน้อยไปหามากด้วยค่ะ รบกวนช่วยแนะนำด้วยค่ะ

รหัส        วันที่                  จำนวน        รวม
001       1/1/54                 5               5
001       10/1/54               5               10
001       20/2/54               5               15

002       2/2/54                 5               5
002       15/2/54               5               10
002       3/3/54                 5               15

003       1/1/54                 2                 2
003       30/5/54               1                 3
003       2/6/54                 1                 4





    

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

1 @R10189
select T1.รหัส, T1.วันที่, T1.จำนวน, (select sum(T2.จำนวน) from เทเบิล as T2 where (T2.รหัส = T1.รหัส) and (T2.วันที่ <= T1.วันที่)) as รวม from เทเบิล as T1 where ..(ถ้ามี).. order by T1.รหัส, T1.วันที่
2 @R10283
อาจารย์ค่ะ รหัส 001,002,003 เป็นรหัสที่อยู่ใน เทเบิลเดียวกันหมดเลยนะค่ะ ไม่ทราบว่าที่อาจารย์อ้าง T1 และ T2 คือยังไงค่ะ เนื่องจาก รหัส ,วันที่,จำนวน เป็นข้อมูลที่มีอยู่แล้วแต่หนูอยากจะเพิ่มช่องคำนวณ "รวม" เพิ่มเข้ามาใน Query โดยการคำนวณจากช่อง "จำนวน" (sum แบบ Over Group) เช่น รหัส 001 บรรทัดแรกเป็น 5 บรรทัดทีสองเป็น 10 (ได้จาก 5+5) บรรทัดที่สามเป็น 15 (ได้จาก 10+5) แบบนี้ไปเรื่อย ๆ ค่ะ กว่าจะหมดข้อมูลของรหัส 001 ส่วนรหัสอื่น ๆ ก็คำนวณเหมือนกัน แต่อยู่ใน Query เดียวกันค่ะ

3 @R10284
ตามที่ผมเขียนให้ไป คุณได้ทำตามหรือยัง แล้วผลออกมาเป็นอย่างไร ถูกหรือไม่ถูก ลองแสดง ตย. ผลลัพธ์ให้ดูหน่อยครับ

ปล. คะ อ่านออกเสียงสูง, ค่ะ อ่านออกเสียงต่ำ ดังนั้น
"อาจารย์ค่ะ" ต้องเขีัยน "อาจารย์คะ"
"เลยนะค่ะ" ต้องเขียน "เลยนะคะ"
"ยังไงค่ะ" ต้องเขียน "ยังไงคะ"
"ไปเรื่อย ๆ ค่ะ" อันนี้เขียนถูกแล้ว
"เดียวกันค่ะ" อันนี้เขียนถูกแล้ว
4 @R10287
อาจารย์คะ ก่อนอื่นต้องขอโทษด้วยนะค่ะ ที่ใช้คำผิด และก็เรื่องงานหนูมือใหม่จริง ๆ เลยไม่ค่อยเข้าใจค่ะ แต่หนูลองทำใหม่แล้วก็ได้ถูกต้องตามที่อาจารย์บอกมาเลยค่ะ ต้องขอบคุณจริง ๆ หนูติดมาหลายวันแล้วนึกไม่ออกว่าต้องทำอย่างไร หนูอยากจะบอกว่าต้องขอบคุณจริง ๆ กับ เว็บดี ๆ แบบนี้ ที่ทำให้คนที่ไม่รู้ได้รู้เรื่องมาก ๆ ขึ้น อยากให้ช่วย ๆ กันอย่างนี้ต่อ ๆ ไป เป็นประโยชน์มาก ๆ เลย อย่างหนูก็เป็นอีกคนหนึ่งที่กำลังเดือดร้อนเรื่องงานตัวนี้ไม่รู้จะทำยังไง อ่านหนังสือก็ไม่มี แต่พอมาถามเว็บนี้หนูได้คำตอบเลย ต้องขอบคุณมาก ๆเลยนะค่ะ อาจารย์สันติสุข และถ้าต่อไปหนูติดอะไรหนูจะมารบกวนอาจารย์อีกนะค่ะ และถ้าหัวข้อไหนหนูพอจะรู้หนูจะมาช่วยกันตอบนะค่ะ เพื่อช่วยคนที่เดือนร้อนเหมือนอย่างหนูนะค่ะ
5 @R10288
"ด้วยนะค่ะ" เขียนผิด
"มาก ๆเลยนะค่ะ" เขียนผิด
"อีกนะค่ะ" เขียนผิด
"ช่วยกันตอบนะค่ะ" เขียนผิด

[SIZE=5]คะ กับ ค่ะ อย่าเขียนผิด[/FONT]
6 @R10310
อาจารย์คะ หนูขอถามเพิ่มเติม คือหนูจะทำ Query คิดต้นทุนแบบเฉลี่ย ให้ออกมาตามด้านล่างช่วยแนะนำด้วย

สูตร       มูลค่าต้นงวด + ซื้อ (จน. เงิน) / ปริมาณต้นงวด + ซื้อ (จน. ของ

รหัส        วดป      จน.รับ   ราคารับ    จ่าย   คงเหลือ   ราคาเฉลี่ย
001     1/1/54        20        5                     20           5     (100+0)/20
001     3/2/54        10        3                     30          4.3   (100+30)/30
001     5/2/54        5           4                     35          4.29 (130+20)/35
001     9/3/54        0                         2       33          4.29 (150-8.58)/33
001     11/4/54      6           2                     39          3.93(141.42+12)/39
            
002     5/1/54        20        5                     20           5     (100+0)/20      
002     3/3/54        0                         3       17           5     (100-15)/17      
002     5/4/54        5           4                     22          4.77 (85+20)/22      
002     21/4/54      0                         2       20          4.77 (105-9.46)/20
002     11/5/54      6           5                     26          4.83 (95.54+30)/26

ในส่วนของ คงเหลือ คิดได้แล้วตามที่อาจารย์แนะนำมาคือ เอา (รับ-จ่าย) แล้วทำการ Running sum แบบ Over Group เอา ในส่วนของราคาเฉลี่ยก็ทำเหมือนกันคือ (จน.รับ * ราคารับ) แล้ว Running sum แบบ Over Group แต่จะมาติดที่ จ่าย คือ เราต้องการหาราคาเฉลี่ยของการจ่าย (เนื่องจากเราจะทราบแต่ราคาของรับของเข้ามาอย่างเดียว) เวลาจ่ายเราจะต้องเอาราคาเฉลี่ยของรับก่อนหน้ามาเป็นราคาเฉลี่ยแล้วเมื่อมีรับเข้ามาอีกเราก็ต้องคิดเฉลี่ยกันต่อ ๆ ไป แต่ค่ามันไม่ได้ตามด้านบน รบกวนช่วยแนะนำด้วยค่ะ
7 @R10316
ราคาเฉลี่ย ณ บรรทัดใดๆ = มูลค่าคงเหลือ ณ บรรทัดนั้นๆ / จำนวนคงเหลือ ณ บรรทัดนั้นๆ

มูลค่าคงเหลือ ณ บรรทัดใดๆ = Sum( (จำนวนรับ x ราคารับต่อหน่วย) - (จำนวนจ่าย x ราคาจ่ายต่อหน่วย) )

และเนื่องจากคุณสามารถหา ราคารับต่อหน่วย ได้แล้ว ดังนั้นก็น่าจะหาคำตอบได้นะครับ ซับซ้อนหน่อย ค่อยๆแทนแต่ละส่วนด้วย SQL ที่คุณได้ทำมาแล้ว ก็น่าได้ผลลัพธ์ที่ต้องการ ลองทำดูครับ
8 @R10317
แก้ไข ที่ถูกต้องเป็น

และเนื่องจากคุณสามารถหา ราคาจ่ายต่อหน่วย ได้แล้ว
9 @R10523
อาจารย์หนูลองทำดูแล้วเกือบจะเสร็จเรียบร้อยแล้ว แต่ติดตรงที่ว่า กรณี รับ และจ่ายในวันเดียวกัน เวลายอดคงเหลือจะขึ้นจำนวนเท่ากันดังนี้ ซึ่งค่าที่ถูกต้องของบรรทัดที่ 3 จะต้องเป็น 35 แต่มันโชว์ค่าโดยการเอา 5-2=3 แล้วมาบวกกับ 30 จึงได้ 33 ทั้งสองบรรทัดเลยรบกวนช่วยแนะนำด้วยค่ะ

รหัส        วดป      จน.รับ       จ่าย   คงเหลือ   
001     1/1/54        20                    20           
001     3/2/54        10                    30          
001     5/2/54        5                      33     => 35          
001     5/2/54        0             2       33
          
และในส่วนของ มูลค่าคงเหลือ ณ บรรทัดนั้นๆ ก็ลองทำแล้วค่าบางตัวตรงแต่บางตัวก็ไม่ตรงอยากจะส่งตัวอย่างให้อาจารย์ดู เพราะหนูลองแก้หลายรอบแล้วไม่รู้ว่าเกิดจากอะไร จะส่งให้อาจารย์ช่วยดูได้ที่ไหนคะ
10 @R10524
สิ่งที่ต้องทำคือต้องมีฟิลด์อะไรเพิ่มเติมเพื่อให้ฟิลด์วันที่+ฟิลด์ที่เพิ่มนี้เป็น unique key สำหรับเรคอร์ดชุดนี้ให้ได้ และต้องบอกถึงลำดับการเกิดของเรคอร์ดนี้ภายในวันเดียวกันได้ด้วย เช้น คุณอาจเก็บทั้งวันและเวลาที่เกิดรายการ หรือคุณอาจมี running no. เรียงจาก 1,2,3,... ไปเรื่อยๆภายในวันเีดียวกัน

เมื่อเพิ่มได้แล้ว คุณก็ต้องแก้ไขในส่วนที่ผมเน้นตัวอักษรเข้มเพื่อให้ใช้กับสิ่งที่เพิ่มขึ้นมาด้วย

select T1.รหัส, T1.วันที่, T1.จำนวน, (select sum(T2.จำนวน) from เทเบิล as T2 where (T2.รหัส = T1.รหัส) and (T2.วันที่ <= T1.วันที่)) as รวม from เทเบิล as T1 where ..(ถ้ามี).. order by T1.รหัส, T1.วันที่

ลองไปคิดดูก่อนครับ
11 @R10574
อาจารย์หนูลองไปคิดดูแล้วและลองทำหลายวิธีแล้วก็ยังไม่สำเร็จ เนื่องจากข้อมูล รับ และ จ่าย มาจากคนละ Table แล้วนำมา Union กัน ไม่ได้อยู่ใน Table เดียวกัน ซึ่งแต่ละ Table ก็จะมี Primary Key ของมันอยู่แล้ว แต่ใน Query ก็จะมี Record CIN_type (IN , OUT) อยู่ แต่หนูไม่รู้ว่าจะกำหนดเงื่อนไขที่อาจารย์เน้นมาว่าเป็นยังไง หนูได้ส่งตัวอย่างที่หนูทำให้อาจารย์ดูที่
accboard@gmail.com รบกวนอาจารย์ช่วยดูด้วยนะค่ะ หัวข้อ thai-access.com/yeadram_view.php?topic_id=2188
12 @R10575
ต้องรอไปก่อนนะครับ ช่วงนี้งานผมกำลังยุ่งทีเดียว อย่างเร็วคือวันศุกร์ครับ
13 @R10594
ก็ในทำนองเดียวกันกับที่ตอบไปก่อนหน้านี้แหล่ะครับว่า ฟิลด์ Q_IN_COST.DateStockAdded และ Q_OUT_COST.date_out มันไม่ Unque เพียงพอที่จะบอกได้ว่า ในวันเดียวกัน เรคอร์ดไหนเกิดก่อนหรือเกิดหลัง เพราะมันมีแต่ค่าของวันที่ เช่น จากคิวรี่ Q_InOut เรคอร์ดที่ 13 และ 14 เป็นวันที่ 02/05/2011 ดังนั้นเมื่อหายอดคงเหลือ (ฟิลด์ Q_InOut.aa) ของเรคอร์ดที่ 13 ด้วยเงื่อนไขคือหาวันที่ที่น้อยกว่าหรือเท่ากับ 02/05/2011 มันจึงไปคิดรวมเรคอร์ดที่ 14 ด้วย แต่เมื่อผ่านเรคอร์ดที่ 13 ไปแล้ว มันก็จะคำนวนหาได้ถูกต้องอีกครั้ง

วิธีแก้ก็คือต้องทำให้มัน Unique    อย่างง่ายที่สุด ผมว่าเพิ่มการป้อนค่าของเวลาเข้าไปในฟิลด์ Q_IN_COST.DateStockAdded และ Q_OUT_COST.date_out แหล่ะครับ เวลาป้อนก็ให้ป้อนเป็น 02/05/2011 14:55 ครับ แล้วผลของฟิลด์ Q_InOut.aa ควรจะแสดงออกมาได้อย่างถูกต้องครับ ถ้าเราไม่รู้ว่าเวลาจริงๆมันกี่โมงเพราะมันอาจเป็นข้อมูลเก่าแล้ว เราก็เติมกี่โมงไปก็ได้ครับ แต่ถ้ามีวันซ้ำกัน เราก็ต้องเติมเวลาให้ต่างกันนะครับ

ฟิลด์ประเภทวันที่ ถ้าป้อนวันที่อย่างเดียวไม่ป้อนเวลา มันก็จะเก็บแต่วันที่ แต่ถ้าป้อนเวลาเข้าไปด้วยมันก็จะเก็บทั้ฃวันที่และเวลาให้ครับ นอกจากนี้ ในปัญหาอีกข้อที่ถามมา ก็เชื่อว่าเป็นเพราะมันไม่ Unique นี่แหล่ะครับ ถ้าเพิ่มเวลาเข้าไปในฟิลด์วันที่แล้ว น่าจะแก้ไขปัญหาได้ทั้งหมดครับ

ปล. ในเมล์ที่คุณส่งมา คะ กับ ค่ะ เขียนสลับกันหมดทุกคำ คะ-เสียงสูงกว่า ค่ำ-เสียงต่ำกว่า
14 @R10628
ลองแก้ที่วันที่แล้วคีย์เวลาเพิ่มเข้าไป ข้อมูลออกมาถูกต้องแล้วในส่วนของยอดคงเหลือ แต่ในส่วนของอีกคำถามที่ถามไปยังมีค่าเท่าเดิมที่ไม่ถูกต้อง ไม่ทราบว่าเกิดจากอะไร รบกวนอาจารย์ช่วยดูอีกทีนะค่ะ ขอบคุณมาก ๆ เลยคะ
15 @R10629
คุณลองตรวจดูอีกทีครับ ผมไม่มีเวลามาตรวจครับ
16 @R10638
ขอบคุณมาก ๆ คะ จริง ๆ แล้วหนูก็นั่งคิดอยู่นานแล้วแต่ยังหาจุดผิดไม่ได้สักที อาจารย์ค่ะ หนูอยากได้ที่อยู่ของอาจารย์ พอดีวันหยุดนี้จะไปเที่ยว อยากจะส่งโปสการ์ดมาให้อาจารย์ รบกวนขอด้วยนะค่ะ ขอบคุณมาก ๆ คะ
17 @R10642
ลองทำคิวรี่ที่แสดงส่วนประกอบของนิพจน์ที่ประกอบขึ้นเป็นฟิลด์ g ดูสิครับ เช่น g = sum(in) - sum(out) เราก็ลองแสดงออกมาดูว่า sum(out) เป็นเท่าไหร่ ถ้า sum(out) ให้ค่าผิด และ sum(out) = out qty * average unit cost เราก็ลองแสดง out qty และ average unit cost ออกมาเช่นเดียวกัน แตกย่อยไปทีละนิพจน์อย่างนี้ คุณก็จะเจอที่ผิดเอง

ขอบคุณครับที่จะส่งโปสการ์ดมา แต่ผมคิดว่ายังไม่อยากบอกที่อยู่ ณ ตอนนี้ กลัวเดี๋ยวใครไม่พอใจคำตอบของผม จะมาดักตีหัวเอา 555 รอไว้เดี๋ยวตกงานก่อน แล้วจะประกาศรับจ๊อบทางบอร์ดนี่แหล่ะ

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