ใช้งาน Function Row_Number() บน SQL 2005
เขียนบทความแรก ของ ปีนี้เลยครับ พอดีว่า เพิ่ง เจอ โจทย์ มาสดๆ หมาดๆ ครับ เห็นว่าเป็นประโยชน์ดี
เลย นำมา post
ครับ ปัญหาที่เจอ คือ ทำรายงาน โดย นำข้อมูล 2 ตาราง มาแสดงใน รายงานเดียวกัน ฟังดูเหมือนไม่มีอะไร
ข้อมูล มีดังนี้
ตาราง แรก CustomerRisk
ตาราง ที่ สอง CustomerProfile
จะสังเกตุได้ว่า ตารางทั้ง 2 ตาราง เป็น ตาราง รายละเอียด ของลูกค้า นะครับ
ซึ่ง ลูกค้า 1 คน อาจมี รายละเอียด หลายๆ record โดยที่ ทั้ง 2 ตาราง จะเก็บข้อมูลซึ่ง ไม่เกี่ยวกันเลย
มีความสำพันธ์กัน แค่เพียง Field เดียว คือ CustomerID เท่านั้น ซึ่ง ทั้ง 2 ตารางจะ ไป Link กับ
ข้อมูล ในตาราง Customer อีกครั้ง
ผลลัพธ์ ที่ต้องการคือ ออกรายงาน หน้าตา แบบนี้ ครับ
<-----Table Customer Risk----><----Table Customer Profile---->
ธรรมชาติ ของการ ออกรายงาน ด้วย Crystal report เพื่อ Performance แล้ว คือ ต้อง Query
ข้อมูล ที่ต้องการ เป็น Table เดียว แล้วส่งให้ Crystal Report ถึงจะ มีประสิทธิภาพดี
แต่ จากข้อมูล ทั้ง 2 ตาราง ถ้า join กัน จะต้อง มี Key ที่ใช้ Join กัน แต่ เนื่อง จาก 2 ตารางนี้
มี Field ที่มีความสัมพันธ์ กันเพียง Field เดียว คือ CustomerID
ดังนั้น ถ้า Join กันแบบ ธรรมดาด้วย Field CustomerID คุณจะได้ ผลลัพธ์ ในลักษณะ many to many
จะ ไม่ได้คำตอบ ของ โจทย์นี้
ถ้าสังเกตุ ความต้องการ คือ ตารางแรก และ ตาราง ที่ สอง มาวางเรียงกัน
โดย เรียงตาม Customer ID และ Date เรียงตามลำดับ จากน้อยไปมา
ถ้าจะมองให้ดี จะเห็นความสัมพันธ์ ของทั้ง สอง Table คือ ครั้งที่ แต่ Field ครั้ง ที่ไม่มี ใน Table
ต้องสร้างขึ้นเอง ในที่นี้ เนื่องจาก ผมใช้ SQL2005 เป็น Database จึง มี Function Row_number()
ให้ใช้งาน
ส่วน วิธีการใช้ มาดู ตอนต่อไปครับ วันนี้ เอาแค่นี้ก่อน
เลย นำมา post
ครับ ปัญหาที่เจอ คือ ทำรายงาน โดย นำข้อมูล 2 ตาราง มาแสดงใน รายงานเดียวกัน ฟังดูเหมือนไม่มีอะไร
ข้อมูล มีดังนี้
ตาราง แรก CustomerRisk
CustomerID | RiskDate | RiskLevel |
1 | 15/1/2009 | Level1 |
1 | 1/2/2009 | Level1 |
1 | 15/2/2009 | Level2 |
1 | 28/2/2009 | Level3 |
2 | 15/1/2009 | Level1 |
2 | 1/2/2009 | Level1 |
ตาราง ที่ สอง CustomerProfile
CustomerID | ProfileDate | ProfileDetail |
1 | 15/1/2009 | Detail1 |
1 | 8/2/2009 | Details2 |
2 | 5/3/2009 | Detail1 |
จะสังเกตุได้ว่า ตารางทั้ง 2 ตาราง เป็น ตาราง รายละเอียด ของลูกค้า นะครับ
ซึ่ง ลูกค้า 1 คน อาจมี รายละเอียด หลายๆ record โดยที่ ทั้ง 2 ตาราง จะเก็บข้อมูลซึ่ง ไม่เกี่ยวกันเลย
มีความสำพันธ์กัน แค่เพียง Field เดียว คือ CustomerID เท่านั้น ซึ่ง ทั้ง 2 ตารางจะ ไป Link กับ
ข้อมูล ในตาราง Customer อีกครั้ง
ผลลัพธ์ ที่ต้องการคือ ออกรายงาน หน้าตา แบบนี้ ครับ
<-----Table Customer Risk----><----Table Customer Profile---->
CustomerID | RiskDate | RiskLevel | ProfileDate | ProfileDetail |
1 | 15/1/2009 | Level1 | 15/1/2009 | Detail1 |
1 | 1/2/2009 | Level1 | 8/2/2009 | Details2 |
1 | 15/2/2009 | Level2 | ||
1 | 28/2/2009 | Level3 | ||
2 | 15/1/2009 | Level1 | 5/3/2009 | Detail1 |
2 | 1/2/2009 | Level1 |
ธรรมชาติ ของการ ออกรายงาน ด้วย Crystal report เพื่อ Performance แล้ว คือ ต้อง Query
ข้อมูล ที่ต้องการ เป็น Table เดียว แล้วส่งให้ Crystal Report ถึงจะ มีประสิทธิภาพดี
แต่ จากข้อมูล ทั้ง 2 ตาราง ถ้า join กัน จะต้อง มี Key ที่ใช้ Join กัน แต่ เนื่อง จาก 2 ตารางนี้
มี Field ที่มีความสัมพันธ์ กันเพียง Field เดียว คือ CustomerID
ดังนั้น ถ้า Join กันแบบ ธรรมดาด้วย Field CustomerID คุณจะได้ ผลลัพธ์ ในลักษณะ many to many
จะ ไม่ได้คำตอบ ของ โจทย์นี้
ถ้าสังเกตุ ความต้องการ คือ ตารางแรก และ ตาราง ที่ สอง มาวางเรียงกัน
โดย เรียงตาม Customer ID และ Date เรียงตามลำดับ จากน้อยไปมา
ถ้าจะมองให้ดี จะเห็นความสัมพันธ์ ของทั้ง สอง Table คือ ครั้งที่ แต่ Field ครั้ง ที่ไม่มี ใน Table
ต้องสร้างขึ้นเอง ในที่นี้ เนื่องจาก ผมใช้ SQL2005 เป็น Database จึง มี Function Row_number()
ให้ใช้งาน
ส่วน วิธีการใช้ มาดู ตอนต่อไปครับ วันนี้ เอาแค่นี้ก่อน
ความคิดเห็น
แสดงความคิดเห็น