Function Row_Number() (ต่อ)

คราวที่แล้ว ว่า ไปถึงตัวอย่าง โจทย์ แล้วนะครับ คราวนี้ มาทำความเข้าใจถึง วิธีการกันครับ

ที่ผมว่า ตาราง สอง ตาราง มีความสัมพันธ์ กัน ตามโจทย์ คือ CustomerID และ ครั้งที่ (จะหมายถึง Record ที่) ใน Database นั่นเอง ถ้ากำหนดให้ การ Key ข้อมูล ต้องเรียงตามลำดับ จาก ก่อนไปหลัง
หรือเรียงลำดับตามวันที่ แบบ ascending นั้นเอง แต่ เนื่องจาก Field ลำดับที่ไม่มี เราสามารถใช้ Function
Row_number() (* เฉพาะ SQL 2005 ขึ้นไป) ในการสร้าง Logical Field นี้ โดย ผมจะสร้าง view ขึ้นอีก
2 views สำหรับเพิ่ม Field [No] ขึ้น ให้กับทั้งสอง ตาราง

ดังนี้

-- สร้าง view สำหรับ CustomerRisk
CREATE VIEW [app].[vCustomerRisk]
AS
SELECT TOP (100) PERCENT
C.AccountNo,
row_number() OVER(partition by C.AccountNo order by C.RiskDate ) AS [No],
C.RiskDate , C.RiskDate, C.RiskLevel
FROM CustomerRisk
ORDER BY C.AccountNo, C.RiskDate
GO
ผลลัพธ์ ของ view คือ

CustomerID No RiskDate RiskLevel
1 1 15/1/2009 Level1
1 2 1/2/2009 Level1
1 3 15/2/2009 Level2
1 4 28/2/2009 Level3
2 1 15/1/2009 Level1
2 2 1/2/2009 Level1



-- สร้าง view สำหรับ CustomerProfile
CREATE VIEW [app].[vCustomerProfile]
AS
SELECT TOP (100) PERCENT
C.AccountNo,
row_number() OVER(partition by C.AccountNo order by C.ProfileDate) AS [No],
C.RiskDate , C.ProfileDate, C.ProfileDetail
FROM CustomerProfile
ORDER BY C.AccountNo, C.RiskDate
GO

ผลลัพธ์ของ view คือ

CustomerID No ProfileDate ProfileDetail
1 1 15/1/2009 Detail1
1 2 8/2/2009 Details2
2 1 5/3/2009 Detail1


หลังจาก สร้าง 2 view แล้ว เราจะสามารถ สร้าง Report ตามโจทย์ที่กำหนด ได้ดังนี้

1. สร้าง combination Table (logical) ที่จะ join ทั้ง 2 view เข้ามา concept คือสร้าง Query ที่มี
2 Field คือ CustomerID และ No โดยมีข้อแม้ ว่า Field No หรือ ครั้งที่ ต้องมีทุกครั้ง วิธีการคือ
select ทั้ง 2 field จาก 2 view ที่สร้างขึ้น แล้วมา Union กัน

SELECT R.AccountNo, R.No FROM [app].[vCustomerRisk]
UNION
SELECT P.AccountNo, P.No FROM [app].[vCustomerProfile]

ผลลัพธ์ จากการ Union จะได้ ผลลัพธ์ ดังนี้
CustomerID No
1 1
1 2
1 3
1 4
2 1
2 2

จากนั้น นำ View ที่สร้างขึ้นมา Join เข้าไปเพื่อให้ได้ Output ดังนี้

SELECT A.AccountNo, A.No, R.RiskDate,R.RiskLevel, P.ProfileDate, P.ProfileDetail
FROM
(SELECT
R.AccountNo, R.No FROM [app].[vCustomerRisk]
UNION
SELECT P.AccountNo, P.No FROM [app].[vCustomerProfile]
) AS A LEFT OUTER JOIN
[app].[vCustomerRisk] AS R ON R.AccountNo=A.AccountNo AND R.No=A.No
LEFT OUTER JOIN
[app].[vCustomerProfile] AS P ON P.AccountNo=A.AccountNo AND P.No=A.No

โดยผลลัพธ์ จากการเีรียก คำสั่งนี้คือ

CustomerID No RiskDate RiskLevel ProfileDate
ProfileDetail
1 1 15/1/2009 Level1 15/1/2009 Detail1
1 2 1/2/2009 Level1 8/2/2009 Details2
1 3 15/2/2009 Level2

1 4 28/2/2009 Level3

2 1 15/1/2009 Level1 5/3/2009 Detail1
2 2 1/2/2009 Level1



จะเห็นว่า เราสามารถประยุกต์ ใช้งาน Function row_number() ของ SQL 2005 ได้
โดยรายละเอียดการใช้ Function row_number() สามารถ ดู Help ของ
Function นี่ได้ ตาม Link

http://msdn.microsoft.com/en-us/library/ms186734(classic).aspx


หมายเหตุ ใน Edition Compact Edition เข้าใจว่าไม่สามารถใช้ได้

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ปัญหาเด็ก กลืน ดินน้ำมัน

ปัญหา Custom Paper Size บน Crystal Report

Function Baht Text บน Crystal Report