เมื่ออาจารย์โดนลูกศิษย์ลองภูมิ .. [DAX Power BI]

“เมิงเคยโดนลูกศิษย์ลองภูมิไหม?” นัทถามกลางวงสนทนาเพื่อนเก่า
“เช่นยังไง?” ผมถามกลับ
“เช่น ถามคำถามยาก ๆ ลองเชิงว่าเมิงรู้จริงหรือเปล่า”
คำถามนัททำให้ผมนึกถึงเหตุการณ์นึง …

ณ ออฟฟิศย่านรัชดา
“อาจารย์ นี่น้องเอกซ์ค่ะ น้องเอกซ์เป็นผู้ดูแล Power BI ของบริษัท มาเข้าร่วมการอบรมด้วย” พิม ทีมงานเอชอาร์กล่าวแนะนำ
“สวัสดีครับคุณเอกซ์” ผมส่งยิ้ม
“สวัสดีครับ” เอกซ์ยิ้มทักทายกลับ
“คอร์สนี้สอนตั้งแต่พื้นฐานการใช้ Power BI เกรงว่าคุณเอกซ์น่าจะเคยผ่านมาหมดแล้ว ถ้าผมสอนอะไรผิดไป คุณเอกซ์แนะนำได้เลยนะครับ”
“โอ.. ไม่หรอกครับ ผมเองเพิ่งศึกษา Power BI ไม่กี่เดือน ถือว่ามาปรับพื้นฐานด้วยครับ”
“ด้วยความยินดีครับ”
ผมตอบยิ้ม ๆ

คลาสนี้มีผู้เข้าอบรม 12 คน บางคนไม่เคยใช้ Power BI มาก่อน บางคนเคยใช้แล้วแต่ยังงง ๆ บางคนใช้มาซักพักและมีพื้นฐานดี
แน่นอนว่าคุณเอกซ์คือคนเก่งที่สุด

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

“อยากได้สูตรรวมยอดขายลูกค้า โดยรวมเฉพาะลูกค้าที่ยอดขายเกินหนึ่งล้าน เอกซ์โพล่งถามขึ้นขณะผมเริ่มสอนพื้นฐานการใช้สูตร DAX
“ต้องใช้ฟังก์ชัน CALCULATE ร่วมกับ FILTER ครับ” ผมตอบ
“FILTER ใช้ได้แค่เงื่อนไขเดียว แต่ถ้ามีมากกว่าหนึ่งต้องทำยังไง?”
“ต้องใช้เครื่องหมาย && หรือ || เชื่อมเงื่อนไขเข้าด้วยกันครับ”
“แล้วถ้าเพิ่มเงื่อนไขว่าเป็นลูกค้า Top 10 ล่ะ?”
“ถ้าเช่นนั้น ต้องระบุตารางใน FILTER ด้วยฟังก์ชัน TOPN และเพิ่มเงื่อนไขด้วยฟังก์ชัน KEEPFILTERS ครับ”
“อาจารย์ช่วยทำให้ดูหน่อย?”

ผมชำเลืองเห็นสายตาหลายคนส่งเครื่องหมายคำถาม จากที่กำลังสอนว่า DAX คืออะไร แต่พอมีทั้ง CALCULATE, FILTER, TOPN, KEEPFILTERS มันเกินคำว่าพื้นฐานไปไกล เริ่มมีคนหยิบมือถือมาเล่น

“บางคนยังไม่เคยใช้ DAXเดี๋ยวเราลองฝึกใช้ DAX แบบพื้นฐานก่อนดีไหมครับ ถ้าวันนี้เลิกก่อนห้าโมงเย็น เดี๋ยวกลับมาที่สูตรนี้กัน” ผมเสนอแนะ
“โอเค” เอกซ์ตอบด้วยสีหน้านิ่ง ๆ

“พอเขียน measure เสร็จ ก็นำมาใช้ในกราฟ จากนั้นลองใช้สไลเซอร์ปรับเปลี่ยนเงื่อนไข” จบประโยคนี้ ผมก็เดินดูรอบห้อง เพื่อดูว่ามีใครติดขัดหรือไม่
พบว่าคุณเก่งติดปัญหานิดหน่อย ก็เลยช่วยเช็คว่าเกิดจากอะไร

อยากให้กราฟแสดงยอดขาย 8 สัปดาห์ล่าสุด โดยไม่ใช้สไลเซอร์ช่วย ต้องทำยังไง?” จู่ ๆ เอกซ์ก็โพล่งขึ้น
“ยังไงนะครับ?” ผมถามกลับ
“คือทำได้เฉพาะข้อมูลในปีเดียวกัน แต่ถ้าเป็นช่วงต้นปีที่มีสัปดาห์คาบเกี่ยวกับปีที่แล้ว มันแสดงผลไม่ได้”
ผมอึ้งเมื่อสิ้นเสียง ในใจคิด “ซวยแล้วไง”
“คำถามน่าสนใจมาก แต่ตอนนี้ห้าโมงเย็นแล้ว เดี๋ยวเรามาเฉลยกันพรุ่งนี้ครับ” โชคดีที่ ‘ระฆัง’ ช่วยผมไว้

สิ่งแรกที่ทำหลังกลับบ้านคือเปิดคอมพ์ ทดลองเขียนสูตรอยู่นานสองนาน จนพบว่าต้องสร้าง Calculated Column เพิ่มในตาราง Date เพื่อช่วยคำนวณว่าวันนั้น ๆ อยู่ห่างจากปัจจุบันกี่สัปดาห์

ฟังก์ชันที่ใช้คือ DATEDIFF เช่นอาจตั้งชื่อคอลัมน์นี้ว่า WeekOffset โดยใช้สูตร

 DATEDIFF( TODAY(), tDate[Date], WEEK )

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

SalesLast8W = 
CALCULATE(
   [Sales],
   tDate[WeekOffset]>=-8,
   tDate[WeekOffset]<0
)

“ก่อนจะเริ่มเนื้อหาของวันนี้ เรามาเฉลยคำถามที่คุณเอกซ์ถามเมื่อวานกัน” แล้วผมก็สอนการใช้สูตรที่คิดเมื่อคืน ซึ่งไม่ใช่เนื้อหาที่เตรียมไว้ตั้งแต่แรก

“แล้วถ้าอยากปรับให้เลือกจำนวนสัปดาห์ได้ เช่น 4, 8, 10 ต้องทำยังไง?” เอกซ์ยกมือถาม
“ต้องสร้างตารางเพิ่มเพื่อเป็นตัวเลือกจำนวนสัปดาห์ หลังจากนั้นสร้าง measure อีกตัวนึงครับ”
“อาจารย์ช่วยทำให้ดูหน่อย”

เริ่มจากสร้างตารางที่มีเลขบอกจำนวนสัปดาห์ อาจตั้งชื่อตารางว่า tWeekSelected

แล้วสร้าง measure เพื่อแสดงยอดขายตามจำนวนสัปดาห์ที่เลือกด้วยสูตร

SalesLastNW = 
VAR LastNWeek = 
    SELECTEDVALUE(tWeekSelected[Week],1)*-1
RETURN
CALCULATE( 
    [Sales], 
    tDate[WeekOffset]>=LastNWeek, 
    tDate[WeekOffset]<0 
)

นำไปสร้างกราฟ ได้ผลลัพธ์แบบนี้

คุณเอกซ์แสดงสีหน้าพอใจ หันไปสบตากับคุณเก่งแล้วพยักหน้าให้กัน ในขณะที่อีก 10 คนในห้องส่งสายตาคล้ายบอกว่า
“คุยอะไรกัน (วะ)!”

หลังจากนั้นผมก็สอนเทคนิคอื่นของ Power BI โดยเน้นเทคนิคการปรับแต่งกราฟ คุณเอกซ์ยิงคำถามเป็นระยะ เป็นคำถามเกี่ยวกับการเขียนสูตรทั้งสิ้น
แล้วก็วนกลับมาคำถามเมื่อวาน

“อยากสร้างรีพอร์ตแสดง Top 10 ลูกค้า โดยไม่ใช้สไลเซอร์ช่วย และตัวเลขบรรทัดสุดท้ายต้องเป็นผลรวมเป็นของลูกค้าทั้งหมด เขียนสูตรยังไง?”

โชคดีที่เมื่อคืนผมเตรียมตัวมาแล้ว จึงตอบทันที
นั่นคือสร้าง measure ใหม่ด้วยสูตรนี้

Top10CustSales = 
IF(
   HASONEVALUE(tCustomer[CustomerName]),
   CALCULATE(
      [Sales],
      KEEPFILTERS( 
          TOPN(
              10, 
              ALL(tCustomer), 
              [Sales], DESC
            ) 
        )
   ),
   CALCULATE( [Sales],ALL(tCustomer) )
)

ได้ผลลัพธ์หน้าตาแบบนี้

ถึงตรงนี้ เริ่มมีบางคนลุกไปเข้าห้องน้ำ บางคนเริ่มแอบทำงานอื่น

“แล้วถ้าอยากรวมลูกค้าที่ไม่ใช่ Top 10 เป็น Others ที่บรรทัดก่อนสุดท้าย ต้องทำยังไง?” เอกซ์ถามต่อ
คำถามนี้ทำผมอึ้ง เพราะไม่รู้จริง ๆ ก็ตอบตามตรงว่าไม่รู้
(ภายหลังรู้ว่าทำได้แต่วิธีซับซ้อนมาก อ่านรายละเอียดได้จาก บทความนี้)

ช่วงเบรกผมจึงเข้าไปคุยกับคุณเอกซ์ว่าสิ่งที่ถามคือสิ่งที่กำลังเจอใช่ไหม คุณเอกซ์ตอบว่าใช่ ผมเลยถามว่าแล้วตอนนี้แก้ปัญหายังไง เค้าก็เปิด Data Model ให้ดู

เป็น Data Model ที่มีประมาณ 50 ตาราง โยงกันไปมายุ่บยั่บ
ผมถามว่าทำไมตารางเยอะจัง คุณเอกซ์ตอบว่าแก้โจทย์บางข้อไม่ได้ ก็เลยสร้างตารางใหม่ขึ้นมาโดยใช้ฟังก์ชัน SUMMARIZE (New Table) แล้วสร้างคอลัมน์ขึ้นมาช่วยคำนวณ

“วิธีนี้ไม่ถูกต้องนะครับ การสร้างตารางเพิ่มทำให้ประมวลผลช้า ควรหลีกเลี่ยงโดยสร้างเป็น measure และใช้ฟังก์ชันตระกูล ALL, VALUES, FILTER, SUMX แทน” ผมเสนอแนะ
“ถ้าลดตารางช่วยพวกนี้ได้ จะเหลือไม่กี่ตาราง โมเดลก็ง่ายขึ้น” ผมพูดต่อ
“พยายามเลี่ยงการใช้ฟังก์ชัน SUMMARIZE โดยทฤษฎีแล้วเป็นวิธีการที่ไม่ถูกต้อง” ผมร่ายยาวโดยไม่ได้สังเกตสีหน้าผู้ฟัง
คุณเอกซ์ฟังแล้วไม่ตอบอะไร ..

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

ตัวคุณเก่งและคุณเอกซ์เคยเรียน Power BI กับอีกสถาบันนึง แต่สอนแบบพื้นฐาน ไม่ตอบโจทย์ พอเรียนกับผมรู้สึกตอบโจทย์ ได้เทคนิคใหม่เยอะมาก

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

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

ขอบคุณนักเรียนทุกคนที่ตั้งใจ แม้ว่าพื้นฐานแต่ละคนจะต่างกัน แต่เราก็ประคองกันมาจนจบคอร์ส
คำถามของคุณเอกซ์ดีมาก เป็นคำถามประยุกต์และน่าสนใจ แต่ด้วยความที่คอร์สนี้เป็นคอร์สพื้นฐาน ผมจึงต้องเน้นพื้นฐานก่อน ถ้าอธิบายบางจุดไม่ละเอียดก็ต้องขออภัยด้วย

เคสของที่นี่ค่อนข้างยากทีเดียว ตั้งแต่ผมสอน Power BI มา ที่นี่ถามลึกที่สุดแล้ว แสดงว่ามี requirement ที่ซับซ้อนมาก
ถ้ามองในแง่ร้ายถือว่าโชคร้าย เจอเคสโหด แต่ถ้ามองในแง่ดีถือว่าเจอโอกาสพัฒนาตัวเอง เคสโหด ๆ ทำให้เราเข้าใจ ทำให้เราเก่งขึ้น

จากที่ผมดู Data Model ของที่นี่ ยังมีจุดที่ต้องปรับปรุง มีการสร้างตารางใหม่ขึ้นมาช่วยคำนวณมากเกินไป
ควรศึกษา DAX ในเชิงลึกและสร้าง measure โดยใช้ฟังก์ชันตระกูล ALL, VALUES, FILTER, SUMX ช่วยคำนวณแทน

อย่าเพิ่งคิดว่าเราเก่ง ยังมีเนื้อหาให้ศึกษาอีกมาก
Excel ก็เช่นกัน ยังมีฟังก์ชันให้ใช้อีกมากมาย บางครั้งเรายึดติดกับ VLOOKUP มากเกินไป
ลองเปลี่ยนมาใช้ INDEX หรือลองเขียนสูตรที่ซับซ้อนมากขึ้น

พอพูดจบ ทั้งห้องเงียบกริบ …

ตั้งแต่เคยสอนมานับร้อยครั้ง ไม่เคยพูดปิดคอร์สห่วยขนาดนี้มาก่อน
พลาดและพลาดอย่างแรง …

แม้จะมีคำถามเหนือความคาดหมาย หรือโดนแทรกตลอดการอบรม แต่ด้วยความเป็นวิทยากรแล้วต้องคุมสถานการณ์ให้ได้ ต้องคลี่คลายและหาทางลงที่ดีสำหรับทุกฝ่าย

ที่สำคัญคือต้องควบคุมอารมณ์ น้ำเสียง สายตา ภาษากาย เพราะมันส่งผลต่อความรู้สึกของผู้เรียน

เมื่อเวลาผ่านไป สิ่งที่ผู้เรียนจำได้ไม่ใช่เนื้อหา แต่คือความรู้สึก

สำหรับผมแล้ว นี่คือบทเรียนอันแสนแพง แพงมากจริง ๆ …

หากมีผู้เข้าอบรมในวันนั้นอ่านอยู่ ผมต้องขอโทษด้วยครับ

ป.ล. ผมเขียนบทความนี้เพื่อเตือนตัวเองครับ