SQL Command Convert multiple rows to one row csv format

ไม่แน่ใจว่า แต่ละท่านเคยเจอ โจทย์แบบว่า แปลง ข้อมูลจากที่เก็บข้อมูล เป็น row base
แปลงเป็น 1 column โดย ให้ขั้นข้อมูลระหว่าง row ด้วย comma หรือไม่

เช่น ตัวอย่าง
การหาว่า แต่ละวัน มีการขายสินค้าอะไรไปบ้าง สรุปเป็นวันๆ โดยในวันนั้นๆ ให้แสดง
ผลว่า มีรายการสินค้าอะไรบ้าง ในรูปแบบ รหัสสินค้า คั่น ด้วย comma
คล้ายๆ csv format (comma separate value)

ข้อมูลต้นฉบับ เก็บเป็น record จำนวน 1 record เก็บข้อมูลดังนี้

วันที่ | รหัสสินค้า|จำนวน
1/2/09| 1 | 5
2/2/09| 1 | 10
1/2/09| 2 | 10
2/2/09| 2 | 15
1/2/09| 3 | 10
2/2/09| 3 | 10
3/2/09| 3 | 10
1/2/09| 4 | 10


อยากได้ผลลัพธ์ สรุปเป็น วันๆ ดังนี้

วันที่ | รหัสสินค้า
1/2/09|1,2,3,4,
2/2/09|1,2,3,
3/2/09|3,

วิธีการทำก็คือ การ select ข้อมูลให้อยู่ในรูปแบบ string หรือ (varchar,nvarchar) ขนาดใหญ่
โดยให้คุณเขียน function มา 1 ตัว ในการ แปลง multirow เป็น one row csv format

กรณี SQL 2005
สามารถใช้ SELECT FOR XML PATH ได้

ตัวอย่าง Function สำหรับ SQL2005

CREATE FUNCTION [fnProductList]
(
@D1 smalldatetime
)
RETURNS varchar(1000)
AS
BEGIN
DECLARE @List varchar(1000)


SET @List =(SELECT Productid + ','
FROM table1
WHERE TrnDate= @D1)
FOR XML PATH(''))

RETURN @List

END



ตัวอย่าง Function สำหรับ SQL2000

CREATE FUNCTION [fnProductList]
(
@D1 smalldatetime
)
RETURNS varchar(1000)
AS
BEGIN
DECLARE @List varchar(1000)

SET @List = ''
(SELECT @List=@List+ Productid + ','
FROM table1
WHERE TrnDate= @D1)
)

RETURN @List
END

คราวนี้มาดูวิธีเรียกใช้กัน คือ

SELECT T1.TrnDate,fnProductList(TranDate) AS ProductList
FROM
(SELECT TrnDate
FROM table1
GROUP BY TrnDate) AS T1

ผลที่ได้คือ
TrnDate|ProductList
1/2/09 |1,2,3,4,
2/2/09 |1,2,3,
3/2/09 |3,


นี่ก็เป็นตัวอย่างที่น่าจะได้ใช้บ้างครับ

ความคิดเห็น

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

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

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

Function Baht Text บน Crystal Report