แบบสอบถาม Microsoft Access เพื่อดึงข้อมูลธุรกรรมแบบสุ่มด้วยเกณฑ์ที่ดูเหมือนเป็นไปไม่ได้

ฉันถูกขอให้ช่วยในการพัฒนารายงานเพื่อดึงตัวอย่างธุรกรรมแบบสุ่ม 25% ภายในช่วงวันที่ที่ระบุ ฉันไม่ใช่โปรแกรมเมอร์ แต่ฉันสามารถประดิษฐ์สิ่งต่อไปนี้ได้ค่อนข้างเร็ว:

SELECT TOP 25 PERCENT account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, log.to_data, log.tran_id, log.init 
FROM account INNER JOIN log ON account.ACCT = log.ACCT
GROUP BY account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, log.to_data, log.tran_id, log.init
HAVING (((log.DATE) Between #2/7/2018# And #6/15/2018#) AND ((log.action_txt)="mod" Or (log.action_txt)="del") AND ((log.init)="J1X" 
ORDER BY log.tran_dt

ซึ่งจะส่งคืน 25% ของบันทึกภายในช่วงวันที่ แต่ละแถวของเรคคอร์ดไม่ซ้ำกัน แต่หมายเลขบัญชีแต่ละหมายเลขอาจมีหลายเรคคอร์ดในแต่ละวัน ในบางกรณี บันทึกก็มีวันที่และ tran_id เหมือนกันด้วย

จากการหารือเพิ่มเติมกับผู้ขอ จริงๆ แล้วเขาต้องการดูธุรกรรมทั้งหมดสำหรับ 25% ของบัญชีที่มีกิจกรรมในแต่ละวันภายในช่วงวันที่ ดังนั้น หากมี 100 บัญชีในวันที่ 1/3/2561 โดยมีบันทึกในตารางนี้ เขาต้องการดูธุรกรรมทั้งหมดสำหรับ 25 บัญชีเหล่านั้น หากมี 60 บัญชีในวันที่ 2/3/2561 โดยมีบันทึกในตารางนี้ เขาต้องการดูธุรกรรมทั้งหมดสำหรับ 15 บัญชีเหล่านั้น และอื่น ๆ

ฉันคิดว่าโมดูล Access จะทำงานได้ดีที่สุดในสถานการณ์นี้ เนื่องจากฉันเชื่อว่ามีหลายส่วนในเรื่องนี้ ฉันคิดว่าฉันต้องการฟังก์ชันเพื่อวนซ้ำช่วงวันที่และสำหรับแต่ละวัน: 1. นับหมายเลขบัญชีเพียงครั้งเดียว 2. คืนธุรกรรมทั้งหมดเป็น 25% ของบัญชีทั้งหมด

แต่อย่างที่ผมบอกไป ผมไม่ใช่โปรแกรมเมอร์ และผมเหนื่อยหน่ายกับการค้นหาวิธีแก้ปัญหาที่เป็นไปได้สำหรับหลายๆ ส่วน


person S. H.    schedule 20.06.2018    source แหล่งที่มา
comment
วิธีถามคำถาม SQL ที่ดี ข้อมูลตัวอย่างและผลลัพธ์ที่คาดหวังมีประโยชน์มากกว่าคำอธิบายที่เป็นข้อความ   -  person Andre    schedule 21.06.2018


คำตอบ (1)


ฉันคิดว่ากุญแจสำคัญสำหรับคำถามของคุณก็คือ คุณเพียงแค่ต้องการผลลัพธ์แบบสุ่มหลอกสำหรับรายงานของคุณเท่านั้น ดังนั้นคุณจึงสามารถบังคับให้ตัวสร้างตัวเลขสุ่มเรียงลำดับผลลัพธ์ของคุณใหม่ตามค่าในบันทึกและเวลาปัจจุบันได้

สิ่งนี้น่าจะได้ผล - ฉันถือว่าฟิลด์ actiontxt ของคุณเป็นฟิลด์ข้อความและดึงความยาวของแต่ละฟิลด์ออกมาแล้วนำไปใช้กับวันที่/เวลาปัจจุบันเพื่อสร้างตัวเลขสุ่มหลอกที่สามารถจัดเรียงได้

ทั้งหมดที่ฉันทำคือเปลี่ยน ORDER BY บรรทัดของคุณ

ดูว่าสิ่งนี้เหมาะกับคุณหรือไม่

SELECT TOP 25 PERCENT 
account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, 
log.to_data, log.tran_id, log.init 
FROM account 
INNER JOIN log ON account.ACCT = log.ACCT
GROUP BY account.CID, account.ACCT, account.NAME, log.DATE, log.action_txt, log.field_nm, log.from_data, log.to_data, log.tran_id, log.init
HAVING (((log.DATE) Between #2/7/2018# And #6/15/2018#) AND ((log.action_txt)="mod" Or (log.action_txt)="del") AND ((log.init)="J1X" 
ORDER BY Rnd(CLng(Now()*Len(log.action_txt))-(Now()*Len(log.action_txt)));

แก้ไขแนวคิดที่คล้ายกันจาก คำถามและการตอบกลับ StackOverflow อื่น ๆ

person dbmitch    schedule 21.06.2018