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,
นี่ก็เป็นตัวอย่างที่น่าจะได้ใช้บ้างครับ
แปลงเป็น 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,
นี่ก็เป็นตัวอย่างที่น่าจะได้ใช้บ้างครับ
ความคิดเห็น
แสดงความคิดเห็น