อยากหาค่า 2 ครั้งสุดท้าย
กระทู้เก่าบอร์ด อ.Yeadram

 1,015   6
URL.หัวข้อ / URL
อยากหาค่า 2 ครั้งสุดท้าย

รบกวน อจ.และผู้รู้ทุกท่านครับ

มีร้านอาหารแห่งหนึ่งมีลูกค้าเข้ามารับบริการตลอดทั้งปี ลูกค้าบางรายมาครั้งเดียว บางรายมา 10 กว่าครั้งหากต้องการหาค่าเฉลี่ยค่าเครื่องดื่มและค่าอาหารของลูกค้า 2 ครั้งสุดท้ายล่าสุดว่ามีค่าเท่าไร จะต้องหาทำอย่างไรครับ(หากมาครั้งเดียวก็ใช้ค่านั้นเลย)       ตย
DATE     | CUSTOMER | BEVERAGE|FOOD
1/1/57    | A                  | 250                 | 4500
.
.
17/5/57 | Z                  | 50                  | 1000
29/12/57| A                  | 100               | 2000
31/12/57| A                  | 150               | 2500
เฉลี่ยนาย A มาหลายครั้ง |125                 | 2500
เฉลี่ยนาย Z มาครั้งเดียว | 50                  | 1000    
     กราบขอบพระคุณครับ

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

1 @R19940
ผมลองเขียนโดยใช้ซับคิวรี่ดูนะครับ ประมาณนี้ สมมุติตารางชื่อ Table1

SELECT a.[Date], a.CUSTOMER, a.BEVERAGE, a.FOOD,

(SELECT Max(BEVERAGE) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER AND b.[DATE] =
(SELECT Max([DATE]) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER AND b.[DATE] <
(SELECT Max([DATE]) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER))) AS [Before(BEVERAGE)],

(SELECT Max(BEVERAGE) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER AND b.[DATE] =
(SELECT Max([DATE]) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER)) AS [Last(BEVERAGE)],

(SELECT Max(FOOD) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER AND b.[DATE] =
(SELECT Max([DATE]) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER AND b.[DATE] <
(SELECT Max([DATE]) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER))) AS [Before(FOOD)],

(SELECT Max(FOOD) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER AND b.[DATE] =
(SELECT Max([DATE]) FROM Table1 AS b WHERE b.CUSTOMER = a.CUSTOMER)) AS [Last(FOOD)],

IIf(IsNull([Before(BEVERAGE)]),[Last(BEVERAGE)],([Before(BEVERAGE)]+[Last(BEVERAGE)])/2) AS [Avg(BEVERAGE)],

IIf(IsNull([Before(FOOD)]),[Last(FOOD)],([Before(FOOD)]+[Last(FOOD)])/2) AS [Avg(FOOD)]

FROM Table1 AS a;

มันอาจไม่ใช่วิธีที่ดีที่สุด แต่ตอนนี้คิดได้ประมาณนี้ครับ
มันอาจจะย่อยคำสั่งได้อีก เพื่อให้ทำงานได้เร็วขึ้น ลองปรับใช้ดู
2 @R19952
ขอบพระคุณครับ
3 @R19953
คุณ TTT ลองเช็คดูหน่อยว่า ถ้าปรับ SQL เป็นลักษณะนี้ดู จะตรงความต้องการหรือไม่

select avg(...) , avg(...)
from ... as A
where A.date in (select top 2 from ... as B where B.customer = A.customer order by B.date desc)
group by A.customer
order by A.customer
4 @R19954
ใช้อย่าง อ.สันติสุข ถูกต้องกว่าครับ ใช้ TOP ในการเทียบค่าแทนครั้งเดียวจบ

@HARRAP ครับ ใช้แบบนี้ได้เลยครับ

SELECT A.CUSTOMER AS [ชื่อลูกค้า], Avg(A.[BEVERAGE]) AS [เครื่องดื่ม], Avg(A.[FOOD]) AS [อาหาร]
FROM Table1 AS A
WHERE A.[DATE] IN (SELECT TOP 2 B.[DATE] FROM Table1 AS B WHERE B.[CUSTOMER] = A.[CUSTOMER] ORDER BY B.[DATE] DESC)
GROUP BY A.CUSTOMER
ORDER BY A.CUSTOMER

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