กระทู้เก่าบอร์ด อ.Yeadram
        
           9,760   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.0601s
    
      
		