กระทู้เก่าบอร์ด อ.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
กราบขอบพระคุณครับ
มีร้านอาหารแห่งหนึ่งมีลูกค้าเข้ามารับบริการตลอดทั้งปี ลูกค้าบางรายมาครั้งเดียว บางรายมา 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
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
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
ประมาณนี้ครับ
@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
กราบขอบพระคุณ อจ. ทั้งสองท่านมากๆครับ
Time: 0.3846s
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;
มันอาจไม่ใช่วิธีที่ดีที่สุด แต่ตอนนี้คิดได้ประมาณนี้ครับ
มันอาจจะย่อยคำสั่งได้อีก เพื่อให้ทำงานได้เร็วขึ้น ลองปรับใช้ดู