กระทู้เก่าบอร์ด อ.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เพื่อให้ผลรวมเท่ากัน ผมจะต้องเขียนโค้ดยังไงหรอครับ
รบกวนอาจารย์ผู้เชี่ยวชาญหน่อยนะครับ
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
http://www.thai-access.com/yeadram_view.php?topic_id=2188
2 @R11651
ขอบคุณครับอาจารย์ ช่วยได้มากเลยครับ
3 @R11654
อาจารย์ครับ ผมลองทำตามวิธี Link ข้างบนแล้ว แต่มันขึ้นError ว่า ตัวดำเนินการหายไปในนิพจน์แบบสอบถาม T1.Net inventory ครับ พอดีผมมือใหม่อะครับ เพิ่งเริ่มศึกษายังไม่ค่อยเข้าใจเรื่องของโค้ดมากเท่าไหร่
4 @R11655
อันนี้คือ โค้ดที่ผมใส่ไปครับ
http://www.mediafire.com/?5rtulx347f4d95r
จากภาพด้านบน ผมเอา Demand ลบกับ Unit product แล้วได้มาเป็น
Net inventory แต่ช่อง Net inventory ผมอยากให้มันเป็นผลบวกสะสมครับ
ผมจะต้องแทรกโค้ดเข้าไปตรงไหนหรอครับ ขอขอบคุณที่ช่วยเหลือนะครับ
ส่วนไฟล์ดาวน์โหลด ไม่มีไวรัสแน่นอนครับรับประกัน
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
- ตามลิงค์ที่ผมให้ไป ในคำตอบแรกที่ 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
แต่ผลลัพธ์มันยังไม่ได้เลยครับ รบกวนขอความกรุณาแนะนำอีกสักครั้งนะครับ ขอบคุณครับ
ค่ออีกนิดหน่อย ผมลองทำตามวิธีของอาจารย์แล้วครับ แต่มันขึ้น 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 ด้วย
ลองเปลี่ยนเป็น
SELECT Sum([Net inventory]) From [AG] as B Where B.Month <= AG.Month
แล้วให้แน่ใจว่ามีฟิลด์ [Net inventory] อยู่ในเทเบิล AG ด้วย
8 @R11668
มันน่าจะเป็นแบบนี้รึปล่าวครับอาจารย์ คือ ผมต้องการที่จะนำค่า Net inventory ที่
คำนวณจากใน Query เดียวกัน แต่ในโค้ดมันไปเอา Net inventory ใน เทเบิล AG
ซึ่งมันไม่มีค่าอะไรอยู่จึงทำให้มันแสดงผลออกมาว่างเปล่า
คำนวณจากใน Query เดียวกัน แต่ในโค้ดมันไปเอา Net inventory ใน เทเบิล AG
ซึ่งมันไม่มีค่าอะไรอยู่จึงทำให้มันแสดงผลออกมาว่างเปล่า
9 @R11669
ถ้าเป็นในกรณีด้านบนผมควรจะใส่โค้ดอย่างไรหรอครับ
10 @R11670
ที่คุณเข้าใจหน่ะ ถูกต้องแล้ว
จากลิงค์ที่ไปยังคำตอบเก่า และจากคำตอบ R11656 ผมก็ได้บอกแล้วว่า ภายในฟังก์ชั่น sum(...) ต้องเป็น นิพจน์ต่างๆที่เป็นที่มาของผลรวมสะสม เช่น sum( (iif( อะไร ) * อะไร / อะไร) - AG.demand)
คุณลองไปเขียนนิพจน์นี้ดูเองครับ มันยาว แต่คิดว่าไม่ได้ยากอะไร เพราะมันก็แค่เอาจากที่คุณเขียนเอาไว้แล้ว เอามาต่อๆซ้อนๆกันเท่านั้น
จากลิงค์ที่ไปยังคำตอบเก่า และจากคำตอบ 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 ไม่ได้เอามาใช้ในการคำนวณอ่ะ
ครับผมจะต้องแก้ไขอย่างไงหรอครับ
เพราะ 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 ด้วย เหมือนอย่างในลิงค์ที่ผมให้ไป
เราก็ต้องเขียนว่า
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 ไม่ถูกต้อง แล้วถ้าไม่ใช้แก้ไขอย่างไรหรือครับ
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
ถ้าดูตามรูปที่ให้มา ที่แน่ๆยังไงก็ต้องมี
แต่จะมีนิพจน์อื่นประกอบด้วยหรือไม่ อันนี้ผมไม่ทราบจริงๆ มันขึ้นกับการออกแบบฐานข้อมูลของคุณ ความหมายตรง WHERE clause นี้ใช้เพื่อ หาเรคอร์ดทั้งหมดของ AG2 ที่เดือนไม่มากไปกว่าเดือนของ AG1 ถ้าคุณออกแบบให้มีปีประกอบด้วยเพื่อให้แยกได้ถูกว่านี่เป็นเดือนของปีไหน คุณก็ต้องหานิพจน์ใส่ลงไปเพิ่ม
ส่วน [Days] , [Production] , [Workers needed] หรือ [Demand] ผมว่าไม่เกี่ยวนะ
[AG2].[Month]<=[AG].[Month]
แต่จะมีนิพจน์อื่นประกอบด้วยหรือไม่ อันนี้ผมไม่ทราบจริงๆ มันขึ้นกับการออกแบบฐานข้อมูลของคุณ ความหมายตรง WHERE clause นี้ใช้เพื่อ หาเรคอร์ดทั้งหมดของ AG2 ที่เดือนไม่มากไปกว่าเดือนของ AG1 ถ้าคุณออกแบบให้มีปีประกอบด้วยเพื่อให้แยกได้ถูกว่านี่เป็นเดือนของปีไหน คุณก็ต้องหานิพจน์ใส่ลงไปเพิ่ม
ส่วน [Days] , [Production] , [Workers needed] หรือ [Demand] ผมว่าไม่เกี่ยวนะ
15 @R11675
ได้แล้วครับ ขอบคุณมากครับอาจารย์ ขอบคุณจากใจจริงเลยครับ
Time: 0.2661s