อ้าว! ทำไม Power BI มันขึ้น error ล่ะ? [DAX Order Date Delivery Date ep.1]

“พี่คะ รบกวนดูสูตรให้นิดนึงได้ไหมคะ?” น้องนิจิคนงามให้เกียรติเดินมาหาผมที่โต๊ะ
“มีอะไรหรือครับ” ผมทำเสียงหล่อโดยไม่รู้ตัว
“คือนิจิเขียนสูตรใน Power BI แล้วมันขึ้น error น่ะค่ะ”
“error ยังไงครับ?” ผมได้กลิ่นน้ำหอมจาง ๆ ช่างชวนฝัน..
“แบบนี้ค่ะ” เธอชี้ไปที่จอคอมพ์

สติผมกลับมาทันที
Error ได้ไง?
สูตรไม่ผิด ข้อมูลไม่ผิด syntax ก็ไม่ผิด
แล้วผิดตรงไหน?

สูตร DAX ที่น้องนิจิใช้คือ

YearMonth = 
IF(
    ISBLANK(tOrder[DeliveryDate]),
    300000,
    FORMAT(tOrder[DeliveryDate],"yyyymm")
)

ไม่มีอะไรผิดเลย ฟังก์ชัน IF, ISBLANK, FORMAT ก็ใช้ถูก ทุกอย่างถูกหมด
แต่.. เอ๊ะ!

“ทำไมคอลัมน์ Delivery Date ถึงมีค่าว่างล่ะครับ?” ผมถาม
“อ๋อ เพราะลูกค้ายังไม่ได้รับของจากออเดอร์นั้นค่ะ”

ข้อมูลที่น้องนิจิแสดงคือบันทึกการสั่งซื้อ มี วันที่ (Date) สองแบบ
OrderDate: วันที่สั่งของ
DeliveryDate: วันที่ลูกค้าได้รับของ

ลูกค้าบางคนเพิ่งสั่ง จึงยังไม่ได้รับของ DeliveryDate เป็นค่าว่าง ถูกต้องแล้ว

“ต้องการได้ผลลัพธ์แบบใดจากคอลัมน์นี้ครับ?” ผมถาม
“ต้องการได้ตัวเลขที่เป็นปี ค.ศ. กับเดือนค่ะ เช่น 202010, 201011”
“แล้วทำไมถึงเขียนสูตรว่าถ้าเป็นค่าว่างให้แสดงเป็น 300000 ล่ะครับ?”
ผมสังเกตว่าน้องนิจิใช้ IF คู่กับ ISBLANK
“เพราะหนูต้องการให้ถ้ายังไม่ได้รับของ ให้แสดงผลลัพธ์เป็นตัวเลขที่มากที่สุด เลยกำหนดเป็น 300000 ค่ะ” น้องนิจิตอบ

ตรระของน้องนิจิถูกแล้ว
ผมทดลองคลิกนั่นคลิกนี่ก็ไม่พบว่ามีอะไรผิดปกติ ขณะกำลังจะยอมแพ้ บังเอิญเห็น error message

Expressions that yield variant data-type cannot be used to define calculated columns.

“ไม่ได้ช่วยอะไรกรูเล๊ย!” ผมเซ็งกับข้อความใน error message
“เดี๋ยวนะ!” ผมเห็นคีย์เวิร์ดอะไรบางอย่าง

คีย์เวิร์ดที่ว่าคือ data-type

“หึ ๆ ๆ อย่างนี้นี่เอง” ผมใช้นิ้วกลางซ้ายดันแว่นให้ชิดหน้า
“พี่รู้แล้วหรือคะ?”
“รู้แล้วครับ”
ผมรู้สึกคล้ายเป็น ‘สารวัตรอาเคจิ’ ในการ์ตูนเรื่องคินดะอิจิ

ถ้าเป็นคดีฆาตกรรม “ดายอิ้งเมสเซส” ของเคสนี้คือ error message และคือ Data Type

สูตรไม่ได้ผิด แต่ผิดที่ Data Type
ลองพิจารณาสูตรใหม่ สังเกตบรรทัดที่ 5

YearMonth = 
IF(
    ISBLANK(tOrder[DeliveryDate]),
    300000,
    FORMAT(tOrder[DeliveryDate],"yyyymm")
)

มีการใช้ฟังก์ชัน FORMAT

FORMAT คืออะไร?
FORMAT คือฟังก์ชันที่ใช้เปลี่ยนฟอร์แมตของข้อมูล สามารถกำหนดฟอร์แมตที่ต้องการได้

ในที่นี้น้องนิจิต้องการฟอร์แมตเป็น ปี ค.ศ. และเดือน เช่น 202012 จึงกำหนดเป็น “yyyymm”
(y = year, m = month)

แล้วมันผิดตรงไหน?
ผิดตรงที่ Data Type ของฟังก์ชัน FORMAT คือตัวหนังสือ (Text)!

Data Type ของ IF กรณี TRUE (300000) คือตัวเลข แต่ Data Type ของกรณี FALSE ( FORMAT (.. ) ) คือตัวหนังสือ

YearMonth = 
IF(
    ISBLANK(tOrder[DeliveryDate]),
    300000,
    FORMAT(tOrder[DeliveryDate],"yyyymm")
)

Data Type ของ IF ทั้งสองกรณีขัดแย้งกัน Power BI ไม่รู้ว่าควรเซ็ตเป็นอะไร จึงขึ้น error

Power BI ให้กับความสำคัญกับ Data Type และเป็นเรื่องที่ซีเรียส
ต้องระบุว่า Data Type ของคอลัมน์นี้คืออะไร และระบุได้เพียงแบบเดียว เช่น Date, Text, Whole Number
ไม่เหมือน Excel ที่ไม่ซีเรียส

ถ้าเขียนสูตรนี้ใน Excel จะไม่ขึ้น error

(Excel ไม่มีฟังก์ชัน FORMAT แต่มีฟังก์ชัน TEXT ที่ให้ผลลัพธ์คล้ายกัน)

แล้วควรแก้ไขยังไง?
ถ้ารู้สาเหตุ วิธีแก้ก็ง่ายมาก นั่นคือเปลี่ยน Data Type ให้ตรงกัน

อาจปรับให้ Data Type จาก FORMAT เป็นตัวเลข โดยคูณหนึ่งที่ FORMAT แบบนี้

หรืออาจปรับ 300000 ให้เป็นตัวหนังสือ (Text) “300000” แบบนี้

“ว้าว! เพิ่งรู้ว่าแก้แบบนี้นี่เอง ขอบคุณมากเลยค่ะ” น้องนิจิดีใจ
“ยินดีครับ ว่าแต่.. ทำไมต้องสร้างคอลัมน์นี้ขึ้นมาด้วยล่ะครับ?”
“อ๋อ นิจิต้องการสรุปว่าจำนวนออเดอร์ที่สั่งในแต่ละเดือน ได้รับของเดือนใด เดือนละกี่ออเดอร์ค่ะ”

“อืมม์.. ถ้าต้องการผลลัพธ์แบบนั้น ไม่จำเป็นต้องสร้างคอลัมน์ขึ้นมาเพิ่ม แต่ให้ใช้อีกวิธีนึงครับ”
“เอ๋ ทำไมล่ะคะ?”
น้องนิจิถามด้วยความแปลกใจ
“Power BI ไม่เหมือน Excel ถ้าไม่จำเป็น ไม่ควรสร้างคอลัมน์เพิ่ม ให้เขียนสูตรเป็น Measure แทนครับ”
“ต้องเขียนสูตรยังไงคะ?”

เนื่องจากบทความนี้ยาวมากแล้ว ขอเขียนเป็น ep.2 ครับ ^_^

สำหรับใครที่สนใจไฟล์ตัวอย่างของบทความ ดาวน์โหลดได้จากลิงก์นี้ครับ
https://drive.google.com/file/d/1HrtJXSF9WbHWeWu-U4MWQ-LcvvpxFyac/view?usp=sharing

อย่าลืมแชร์บทความนี้ให้เพื่อนอ่าน เพื่อเป็นกำลังใจให้คนเขียนด้วยนะครับ ^_^

วิศวกรรีพอร์ต

คนธรรมดาผู้มีประสบการณ์ทำงานหลากหลายตำแหน่ง คลุกคลีกับการทำรีพอร์ตมาโดยตลอด สุดท้ายค้นพบแนวทางของตัวเอง จึงอยากแบ่งปันเคล็ดลับและประสบการณ์ให้กับผู้สนใจ

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.