Posted by: siamnobita | 03/16/2016

Dynamic SQL Pivoting

ไม่อยากจะเชื่อว่า วันนี้จะได้รับอีเมล์แจ้งว่ามีคนมาติดตาม blog ของผม ทั้ง ๆ ที่ผมแทบจะไม่ได้กลับมาเขียนอะไรเพิ่มเลย นอกจากแปลกใจแล้ว ก็รู้สึกดีใจลึก ๆ ที่สิ่งที่เคยเขียนไว้อาจจะมีประโยชน์กับใครบางคน ดังนั้นผมจึงขอตอบแทนผู้อ่านด้วยการเขียนหัวข้อใหม่เพิ่ม และจะพยายามเขียนเพิ่มอีกเรื่อย ๆ ตามความสามารถและเวลาที่มี

หัวข้อในวันนี้ ไม่ใช่ผลงานของผมเอง แต่เป็นผลงานของคุณ Anton Scheffer โดยผู้อ่านสามารถอ่านรายละเอียด และ download โปรแกรมได้จาก ที่นี่ และดูตัวอย่างเพิ่มเติมได้ ที่นี่ และขอขอบคุณเว็บ asktom ที่พาผมไปเจอผลงานชิ้นนี้ด้วย

ผมเคยเชื่อมาตลอดจนกระทั่งมาเจอ code นี้ว่า คำสั่ง select ไม่สามารถเปลี่ยนแปลงจำนวน column ที่แสดงผลออกมาได้ ต่อให้เราใช้ syntax PIVOT ของเวอร์ชั่น 11g ที่แปลงจาก rows เป็น columns ได้จำนวน columns ที่ได้ก็ต้องถูกกำหนดตายตัวด้วยค่าที่ระบุไว้อยู่ดี

select /* 1 */ *
from table(pivot(‘select deptno, job, sum(sal) sal from emp group by deptno, job’))
order by 1

DEPTNO ANALYST CLERK MANAGER PRESIDENT SALESMAN
———- ———- ———- ———- ———- ———-
10 1300 2450 5000
20 6000 1900 2975
30 950 2850 5600

insert into emp ( empno, ename, deptno, job, sal )
values ( 8000, ‘TOM’, 10, ‘SUPPORT’, 2500)
1 rows inserted.

select /* 2 */ *
from table(pivot(‘select deptno, job, sum(sal) sal from emp group by deptno, job’))
order by 1
DEPTNO ANALYST CLERK MANAGER PRESIDENT SALESMAN SUPPORT
———- ———- ———- ———- ———- ———- ———-
10 1300 2450 5000 2500
20 6000 1900 2975
30 950 2850 5600

rollback
rollback complete.

จะเห็นได้ว่า คำสั่ง select ทั้งสองครั้งแทบไม่ต่างกันเลย ยกเว้นตัวเลขภายใน comment แต่ผลลัพธ์ที่ได้ในครั้งที่สองมี column เพิ่มขึ้นจากข้อมูลที่เรา insert เพิ่มเข้าไปก่อนหน้า (หากใช้ query ที่เหมือนกันเป๊ะเลย อาจจะไม่ได้ผลแบบนี้ เราต้องหลอก optimizer เพื่อให้ parse คำสั่งใหม่ ด้วยการแก้ไข query เล็กน้อยจึงจะเห็น column ที่เพิ่มขึ้นมา)

ในความเห็นของผม นี่เป็นการประยุกต์ใช้สิ่งที่ oracle มีได้อย่างน่าสนใจและดูมหัศจรรย์มาก แต่ในอีกมุมหนึ่งผมก็ยังนึกไม่ออกเหมือนกันว่าจะนำไปใช้ในงานจริงในกรณีใดบ้าง เพราะเมื่อเรา dynamic ผลลัพธ์ โปรแกรมต่าง ๆ ที่ต้องนำผลลัพธ์นี้ไปใช้ ก็ต้อง dynamic ตามไปด้วย ซึ่งผมเองก็ไม่แน่ใจเหมือนกันว่าจะมี report tools ตัวใดบ้างที่มีความสามารถแบบนี้ นอกจากเราจะเขียนโปรแกรมแสดงผลขึ้นเอง ซึ่งในกรณีนั้น เราก็คงเขียน dynamic sql ได้อยู่แล้ว โดยไม่จำเป็นต้องใช้ code ตัวนี้

อย่างไรก็ดี ต้องขอขอบคุณผู้เขียน เพราะได้ทำให้ผมได้เรียนรู้อะไรเพิ่มขึ้นอีกหลายอย่าง และหวังว่าท่านผู้อ่าน blog นี้ก็คงจะได้ความรู้ใหม่ ๆ เพิ่มขึ้นเช่นเดียวกัน


ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

หมวดหมู่

%d bloggers like this: