สอบถามเรื่องการบวกเลข ภายในฟิลด์ และระหว่างฟิลด์
กระทู้เก่าบอร์ด อ.Yeadram

 9,550   15
URL.หัวข้อ / URL
สอบถามเรื่องการบวกเลข ภายในฟิลด์ และระหว่างฟิลด์

คือปัญหามันเป็นอย่างนี้ครับ

        A B A-B
W    5   2    3
X     3   4    2
Y     3   4    1
Z     4   6    -1
F     4   4    -1
รวม 19 20 X

คือผมมี ฟิลด์ A และ B จากนั้นนำฟิลด์ทั้งสองมาลบกัน แต่ต้องการให้ผลลัพท์

เป็นแบบข้างบน ซึ่งความจริงค่า A-B จะเป็น 3,-1,-1,-2,0 ส่วน A-B ข้างบนคือ

3-0 ,3-1 ,3-1-1, 3-1-1-2, 3-1-1-2-0 ตามลำดับครับ ส่วนผลลัพธ์ที่ผมต้องการเป็น

       A B A-B
W    5   2    3
X     3   4    2
Y     3   4    1
Z     4   6    -1
F     6   4    0
รวม 20 20 X

หากมีตัวเลขที่ติดลบ ในนี้คือ -1 ผมต้องการเอา -1 ก็จะนำไปลบออกจาก
A ในแถว Fเพื่อให้ผลรวมเท่ากัน ผมจะต้องเขียนโค้ดยังไงหรอครับ
รบกวนอาจารย์ผู้เชี่ยวชาญหน่อยนะครับ

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

1 @R11644
2 @R11651
ขอบคุณครับอาจารย์ ช่วยได้มากเลยครับ
3 @R11654
อาจารย์ครับ ผมลองทำตามวิธี Link ข้างบนแล้ว แต่มันขึ้นError ว่า ตัวดำเนินการหายไปในนิพจน์แบบสอบถาม T1.Net inventory ครับ พอดีผมมือใหม่อะครับ เพิ่งเริ่มศึกษายังไม่ค่อยเข้าใจเรื่องของโค้ดมากเท่าไหร่

4 @R11655
อันนี้คือ โค้ดที่ผมใส่ไปครับ
http://www.mediafire.com/?5rtulx347f4d95r


จากภาพด้านบน ผมเอา Demand ลบกับ Unit product แล้วได้มาเป็น

Net inventory แต่ช่อง Net inventory ผมอยากให้มันเป็นผลบวกสะสมครับ

ผมจะต้องแทรกโค้ดเข้าไปตรงไหนหรอครับ ขอขอบคุณที่ช่วยเหลือนะครับ

ส่วนไฟล์ดาวน์โหลด ไม่มีไวรัสแน่นอนครับรับประกัน
5 @R11656
- จากโค้ดที่ผมโหลดมา มันไม่มีเทเบิล T1 และก็ไม่มีฟิลด์ Net Inventory ด้วย เลยไม่แน่ใจว่ามัน error เพราะอะไร

- ตามลิงค์ที่ผมให้ไป ในคำตอบแรกที่ R10189 จะมีฟิลด์ชื่อว่า "รวม" ซึ่งเป็นผลรวมสะสมได้มาจาก sub query (select sum...) อีกที ตรงนี้ผมยังไม่เห็นว่าคุณได้นำไปปรับใส่ไว้ในโค้ดของคุณเลย ส่วนต้อง sum อะไรบ้าง ก็คือต้อง sum ([Units produced]-[AG].[Demand]) ครับ แต่ [Units produced] ก็เป็นผลลัพธ์มาจากนิพจน์อื่นอีกที สรุปสุดท้าย ก็ต้องเป็น sum(นิพจน์ต่างๆที่เป็นที่มาของผลรวมสะสม) ครับ และที่สำคัญไม่แพ้กันก็คือ WHERE clause ใน sub query นี้ ต้องเป็นเงื่อนไขที่สามารถหาเรคอร์ดที่อยู่ก่อนหน้าออกมาได้หมด รวมถึงเรคอร์ดที่กำลังพิจารณาอยู่นี้ด้วย เช่น คุณกำลังพิจารณาเรคอร์ดที่ 10 ดังนั้น WHERE clause ต้องสามารถครอบคลุมเรคอร์ดที่ 1 ถึง 10 ให้ได้ ไม่เช่นนั้นแล้ว จะไม่สามารถใช้วิธีนี้ได้ครับ

- อีกทางที่ทำได้ คือ ไปแสดงผลออกเป็น Report แทนการแสดง Query เพราะใน Report มีคุณสมบัติหายอดสะสมในฟิลด์ได้ครับ http://office.microsoft.com/en-us/access-help/calculate-a-running-sum-cumulative-total-HP005187388.aspx
6 @R11665
อาจารย์ครับ ผมจำเป็นต้องทำออกมาใน Query ครับ เพราะมันต้องใช้คำนวณ

ค่ออีกนิดหน่อย ผมลองทำตามวิธีของอาจารย์แล้วครับ แต่มันขึ้น Error เยอะ

จนไม่รู้จะแก้ตรงไหน ผมลองทำอีกวิธีหนึ่งดู

http://www.mediafire.com/?us28d4870y8w41o

ตาม Link ที่ผมส่งให้ ปรากฏว่าในช่องสุดท้ายที่ต้องการมันว่างเปล่า ไม่ขึ้น

อะไรเลย ผมลองทำตามวิธีนี้ครับ

SELECT ID, Amount, (SELECT Sum(Amount) From A Where A.ID <= B.ID) as CumulativeTotal
From A as B
Order By ID

แต่ผลลัพธ์มันยังไม่ได้เลยครับ รบกวนขอความกรุณาแนะนำอีกสักครั้งนะครับ ขอบคุณครับ
7 @R11666
SELECT Sum([Net inventory]) From [AG] Where AG.Month <= Month

ลองเปลี่ยนเป็น

SELECT Sum([Net inventory]) From [AG] as B Where B.Month <= AG.Month

แล้วให้แน่ใจว่ามีฟิลด์ [Net inventory] อยู่ในเทเบิล AG ด้วย
8 @R11668
มันน่าจะเป็นแบบนี้รึปล่าวครับอาจารย์ คือ ผมต้องการที่จะนำค่า Net inventory ที่

คำนวณจากใน Query เดียวกัน แต่ในโค้ดมันไปเอา Net inventory ใน เทเบิล AG

ซึ่งมันไม่มีค่าอะไรอยู่จึงทำให้มันแสดงผลออกมาว่างเปล่า
9 @R11669
ถ้าเป็นในกรณีด้านบนผมควรจะใส่โค้ดอย่างไรหรอครับ
10 @R11670
ที่คุณเข้าใจหน่ะ ถูกต้องแล้ว

จากลิงค์ที่ไปยังคำตอบเก่า และจากคำตอบ R11656 ผมก็ได้บอกแล้วว่า ภายในฟังก์ชั่น sum(...) ต้องเป็น นิพจน์ต่างๆที่เป็นที่มาของผลรวมสะสม เช่น sum( (iif( อะไร ) * อะไร / อะไร) - AG.demand)

คุณลองไปเขียนนิพจน์นี้ดูเองครับ มันยาว แต่คิดว่าไม่ได้ยากอะไร เพราะมันก็แค่เอาจากที่คุณเขียนเอาไว้แล้ว เอามาต่อๆซ้อนๆกันเท่านั้น
11 @R11671
ผมเพิ่ม Sum(([AG].[Days]*[AssAg].[Production]* AG.[Workers needed]) - [AG].[Demand]) AS [Net inventory]

เพราะ Units produced มาจาก AG.Day*AssAg.Production*AG.[Workers needed]

ไม่ทราบว่าถูกต้องหรือปล่าวครับ เพราะมันขึ้น Error ว่า

"คุณพยายามดำเนินการกับแบบสอบถามที่ไม่ได้ร่วมนิพจน์ที่ระบุ ' Month '

เป็นส่วนหนึ่งของฟังก์ชันการรวม" เพราะว่า Month ไม่ได้เอามาใช้ในการคำนวณอ่ะ

ครับผมจะต้องแก้ไขอย่างไงหรอครับ

12 @R11672
ถูกครึ่งนึง เพราะเรากำลังเขียน SQL statement ที่เป็น sub query (คือส่วนที่เป็น select sum( ) from .. where...) เทเบิล AG และ AssAg ที่เราอ้างใน sum( ) นี้ แม้จะเป็นเทเบิลเดียวกันกับ main query แต่เรากำลังเลือกเรคอร์ดต่างๆที่ต่างไปจาก main query ดังนั้นเราต้องตั้งชื่อเล่นให้แก่เทเบิล AG และ AssAg ใน sub query นี้ด้วย ไม่เช่นนั้นมันจะพยายามไปเอาเรคอร์ดที่กำลังถูกพิจารณาใน main query มาใช้แทน ซึ่งไม่ถูกต้องแน่ๆ   

เราก็ต้องเขียนว่า
select Sum((AG2.Days * AssAg2.Production * AG2.[Workers needed]) - AG2.Demand) AS [Sum Net inventory]
from AG as AG2, AssAG as AssAG2
where ...

สำหรับส่วนของ where นี้ จะมีการอ้างทั้ง AG, AG2, และ/หรือ AssAg, AssAg2 ด้วย เหมือนอย่างในลิงค์ที่ผมให้ไป
13 @R11673
อาจารย์ครับ ผมใช้โค้ดที่อาจารย์แนะนำ

Select Sum(([AG2].[Days] * [AssAg2].[Production] *[AG2].[Workers needed]) - [AG2].[Demand]) AS [Sum Net inventory] from [AG] as [AG2] , AssAG as AssAG2 Where ([AG2].[Days]=[AG].[Days]) And ([AssAg2].[Production]=[AssAg].[Production]) And ([AG2].[Workers needed]=[AG].[Workers needed]) And ([AG2].[Demand]=[AG].[Demand])And([AG2].[Month]=[AG].[Month]) order by [AG].Month)

แต่ว่ามันไม่ได้เป็นผลบวกสะสมกลับเป็นผลลบระหว่างกันแทน ผมคิดว่าผมใส่

where ไม่ถูกต้อง แล้วถ้าไม่ใช้แก้ไขอย่างไรหรือครับ
14 @R11674
ถ้าดูตามรูปที่ให้มา ที่แน่ๆยังไงก็ต้องมี

[AG2].[Month]<=[AG].[Month]

แต่จะมีนิพจน์อื่นประกอบด้วยหรือไม่ อันนี้ผมไม่ทราบจริงๆ มันขึ้นกับการออกแบบฐานข้อมูลของคุณ ความหมายตรง WHERE clause นี้ใช้เพื่อ หาเรคอร์ดทั้งหมดของ AG2 ที่เดือนไม่มากไปกว่าเดือนของ AG1 ถ้าคุณออกแบบให้มีปีประกอบด้วยเพื่อให้แยกได้ถูกว่านี่เป็นเดือนของปีไหน คุณก็ต้องหานิพจน์ใส่ลงไปเพิ่ม

ส่วน [Days] , [Production] , [Workers needed] หรือ [Demand] ผมว่าไม่เกี่ยวนะ
15 @R11675
ได้แล้วครับ ขอบคุณมากครับอาจารย์ ขอบคุณจากใจจริงเลยครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2661s