เวลาทำรายงานให้แสดงรายรับ รายจ่าย รายปี โดยแสดงข้อมูลของแต่ละเดือนให้อยู่ในแถวเดียวกัน แบบนี้
cyear | month1 | month2 | month3 | month4 | month5 | month6 | month7 | month8 | month9 | month10 | month11 | month12 |
2554 | 0 | 5 | 3 | 0 | 34 | 0 | 32 | 32 | 0 | 0 | 0 | 0 |
2555 | 29 | 765 | 97 | 99 | 0 | 0 | 98 | 9 | 98 | 0 | 0 | 22 |
แต่ในตารางเก็บแยกข้อมูลเป็นเดือนละแถว
cyear | cmonth | expense | income |
2554 | 2 | 5 | 77 |
2554 | 3 | 3 | 15 |
2554 | 5 | 34 | 5 |
2554 | 7 | 32 | 64 |
2554 | 8 | 32 | 64 |
2554 | 9 | 0 | 0 |
2555 | 1 | 29 | 38 |
2555 | 2 | 765 | 32 |
2555 | 3 | 97 | 24 |
2555 | 4 | 99 | 8 |
2555 | 7 | 98 | 76 |
2555 | 8 | 9 | 89 |
2555 | 9 | 98 | 8 |
2555 | 11 | 0 | 98 |
2555 | 12 | 22 | 0 |
ถ้าคิวรี่ตามปกติ แถวหนึ่งก็ต้องคิวรี่ครั้งหนึ่ง แสดง 1 ปีก็คิวรี่ 12 ครั้ง ถ้าต้องการคิวรี่แค่ครั้งเดียวสามารถใช้วิธี crosstab ช่วยได้ ก่อนอื่นสร้างข้อมูลตัวอย่างก่อน
CREATE TABLE IF NOT EXISTS `account` ( `cyear` int(4) NOT NULL, `cmonth` int(11) NOT NULL, `expense` decimal(10,0) NOT NULL, `income` decimal(10,0) NOT NULL, PRIMARY KEY (`cyear`,`cmonth`) ) ENGINE=InnoDB; INSERT INTO `account` (`cyear`, `cmonth`, `expense`, `income`) VALUES (2554, 2, 5, 77), (2554, 3, 3, 15), (2554, 5, 34, 5), (2554, 7, 32, 64), (2554, 8, 32, 64), (2554, 9, 0, 0), (2555, 1, 29, 38), (2555, 2, 765, 32), (2555, 3, 97, 24), (2555, 4, 99, 8), (2555, 7, 98, 76), (2555, 8, 9, 89), (2555, 9, 98, 8), (2555, 11, 0, 98), (2555, 12, 22, 0);
จากนั้นก็คิวรี่โดยใช้
SELECT `cyear` ,SUM(IF(`cmonth` = 1 ,expense ,0)) AS month1 ,SUM(IF(`cmonth` = 2 ,expense ,0)) AS month2 ,SUM(IF(`cmonth` = 3 ,expense ,0)) AS month3 ,SUM(IF(`cmonth` = 4 ,expense ,0)) AS month4 ,SUM(IF(`cmonth` = 5 ,expense ,0)) AS month5 ,SUM(IF(`cmonth` = 6 ,expense ,0)) AS month6 ,SUM(IF(`cmonth` = 7 ,expense ,0)) AS month7 ,SUM(IF(`cmonth` = 8 ,expense ,0)) AS month8 ,SUM(IF(`cmonth` = 9 ,expense ,0)) AS month9 ,SUM(IF(`cmonth` = 10 ,expense ,0)) AS month10 ,SUM(IF(`cmonth` = 11 ,expense ,0)) AS month11 ,SUM(IF(`cmonth` = 12 ,expense ,0)) AS month12 FROM `account` GROUP BY `cyear`;
จุดสังเกตคือ
- ใช้ GROUP BY เพื่อรวมข้อมูลแต่ละที่สนใจให้อยู่แถวเดียวกัน ในที่นี้คือ ปี
- การแสดงผลหลัง select จะใช้รูปแบบ ,SUM(IF(ฟิลย์ที่เป็นเงื่อนไข (เดือน) = ค่าที่สนใจ (ลำดับของเดือน) , ฟิลย์ที่ต้องการแสดง (expense) ,ค่าเริ่มต้นถ้าไม่มีข้อมูล)) AS ชื่อใหม่