เก่งโค้ดงาน Business Intelligence ตอนที่ 8
หาเลขอันดับของยอดขาย
| Product | Sales | Product | Sales | Rank | |
| Apples | 10 | Apples | 10 | 5 | |
| Oranges | 30 | Oranges | 30 | 2 | |
| Pears | 30 | Pears | 30 | 2 | |
| Grapes | 20 | Grapes | 20 | 4 | |
| Pineapples | 10 | Pineapples | 10 | 5 | |
| Bananas | 50 | Bananas | 50 | 1 |
ตารางซ้ายชื่อ TiedRanksInput ทำหน้าที่เก็บยอดขายสินค้าประเภทต่าง ๆ คอลัมน์ Product คือรายการสินค้า คอลัมน์ Sales คือยอดขายของสินค้านั้น ๆ สิ่งที่เราต้องการหรือโจทย์คือ “หาเลขอันดับ” (Rank) ของยอดขายของสินค้าแต่ละตัว แล้วนำมาทำเป็นคอลัมน์ใหม่ชื่อ Rank มีผลลัพธ์เป็นอย่างตารางทางขวา สินค้าที่มียอดขายมากที่สุดคือ Bananas มีมูลค่าขาย 50 ถือเป็นอันดับที่ 1 สินค้าที่มียอดขายอันดับรองลงมาคือ Oranges และ Pears เป็นอันดับที่สอง และสินค้าที่มียอดขายต่ำที่สุดคือ Apples และ Pineapples รั้งอันดับที่ห้า
- บรรทัด 5-7 ทำหน้าที่โหลดตาราง TiedRanksInput แล้วกำหนดให้อ้างถึงด้วยชื่อ Source
- บรรทัด 10-13 ประกาศฟังก์ชันซึ่งทำหน้าที่คำนวณเลขอันดับ
- บรรทัด 16 ทำหน้าที่กำหนดให้ตัวแปรหรือค่า Custom1 อ้างอิงไปยังแหล่งข้อมูลต้นทางหรือตาราง TiedRanksInput
- บรรทัด 19-22 นำคอลัมน์ชื่อ Rank ที่จะเป็นค่าอันดับใส่เข้าไปในตาราง ค่าในคอลัมน์นี้เกิดจากการนำค่าในคอลัมน์ Sales ส่งไปยังฟังก์ชัน Rank เพื่อคำนวณคือค่าอันดับ
| Date | Customer | Sales | Date | Distinct Customers | |
| 1-Jan-2019 | Chris | 1 | 1/1/2019 | 3 | |
| 1-Jan-2019 | Helen | 2 | 1/2/2019 | 4 | |
| 1-Jan-2019 | Chris | 2 | 1/3/2019 | 4 | |
| 1-Jan-2019 | Mimi | 4 | |||
| 2-Jan-2019 | Robert | 7 | |||
| 2-Jan-2019 | Chris | 3 | |||
| 2-Jan-2019 | Mimi | 4 | |||
| 2-Jan-2019 | Natasha | 2 | |||
| 3-Jan-2019 | Mimi | 2 | |||
| 3-Jan-2019 | Helen | 6 | |||
| 3-Jan-2019 | Natasha | 4 | |||
| 3-Jan-2019 | Natasha | 3 | |||
| 3-Jan-2019 | Helen | 2 | |||
| 3-Jan-2019 | Rebert | 4 |
- บรรทัด 7-9 ทำหน้าที่โหลดตาราง DistinctCustomersInput แล้วกำหนดให้อ้างถึงด้วยชื่อ Source
- บรรทัด 12-17 ทำหน้าที่แปลงชนิดข้อมูลของคอลัมน์ Date ให้เป็นไทป์ date เพื่อจะได้สามารถนำไปใช้ในการคำนวณในขั้นตอนต่อไปโดยใช้ฟังก์ชัน Table.TransformColumnTypes
- บรรทัด 21-26 เรียกหาฟังก์ชัน Table.Distinct เพื่อลบข้อมูลทั้งหมดที่ซ้ำกันในคอลัมน์ Customer ผลลัพธ์ที่ได้คือค่า DuplicatesRemoved ที่เป็นรายชื่อคนโดยไม่ซ้ำ
- บรรทัด 29-35 หาจำนวนนับของแถวในแต่ละวันด้วยการใช้ฟังก์ชัน Table.Group ที่จะจัดข้อมูลออกเป็นกลุ่ม ๆ ตามค่า DuplicatesRemoved
การแปลงคอลัมน์เดียวให้กลายเป็นหลาย ๆ คอลัมน์
ถ้าเรามีตารางอย่างตาราง ListData ซึ่งเป็นตารางที่มีคอลัมน์เดียว คือคอลัมน์ Data ข้อมูลในคอลัมน์นี้ ทุก ๆ สามแถวเป็นข้อมูลกลุ่มเดียวกัน คือข้อมูลของคนหนึ่งคน ประกอบด้วยชื่อ เพศ และสัญชาติ ถ้าเราสามารถแปลงข้อมูลคอลัมน์เดียวนี้ให้กลายเป็นสี่คอลัมน์อย่างตารางทางขวาก็คงจะมีประโยชน์
| Data | CustomerID | Name | Gender | Country | |
| Chris | 0 | Chris | Male | UK | |
| Male | 1 | Bill | Male | USA | |
| UK | 2 | Helen | Female | Australia | |
| Bill | 3 | Mimi | Female | UK | |
| Male | |||||
| USA | |||||
| Helen | |||||
| Female | |||||
| Australia | |||||
| Mimi | |||||
| Female | |||||
| UK |
- บรรทัด 7-8 ทำหน้าที่โหลดตาราง ListData แล้วกำหนดให้อ้างถึงด้วยชื่อ Source
- บรรทัด 11-13 ใส่คอลัมน์ใหม่ชื่อ Index เอาไว้ทำหน้าเก็บเลขดรรชนีโดยใช้ฟังก์ชัน Table.AddIndexColumn
- บรรทัด 15-19 ใส่คอลัมน์ใหม่ชื่อ RowType เอาไว้ทำหน้าที่เก็บตัวเลข 1, 2, 3 เพื่อไว้ใช้ประมวลผลในขั้นตอนถัดไป
- บรรทัด 22-27 ใส่คอลัมน์ใหม่ชื่อ RowTypeText โดยใช้ฟังก์ชัน Table.AddColumn ทำหน้าที่เก็บข้อมูลที่ระบุว่าแถวข้อมูลนั้นเป็น Name, Gender หรือ Country หากข้อมูลในคอลัมน์ RowType เป็น 0 จะใส่คำว่า Name ไว้ แต่ถ้าเป็น 1 จะใส่คำว่า Gender และถ้าเป็น 2 ให้เป็น Country
- บรรทัด 30-33 ใส่คอลัมน์ใหม่ชื่อ CustomerID โดยใช้ฟังก์ชัน Table.AddColumn เอาไว้ทำหน้าเก็บเลขประจำตัวของลูกค้า เป็นเลขที่เราสร้างขึ้นเดี๋ยวนี้ เพื่อใช้ช่วยจัดกลุ่มข้อมูลของแต่ละคน
- บรรทัด 36-41 ลบคอลัมน์ Index และ RowType ที่ไม่ต้องการใช้ในขั้นตอนต่อไป
- บรรทัด 44-52 ทำ Pivot เพื่อให้ข้อมูล Name, Gender และ Country กลายมาเป็นคอลัมน์ แล้วลบคอลัมน์ RowTypeText และ Data ที่ไม่จำเป็นต้องใช้อีกแล้ว
- New: พวกที่ซื้อในปีนี้แต่ไม่เคยซื้อเมื่อปีก่อน
- Lost: พวกที่ซื้อในปีที่แล้วแต่ไม่ได้ซื้อในปีนี้
- Return: พวกที่ซื้อทั้งในปีนี้และปีที่ผ่านมา
| Customers This Year | Customers Last Year | Customer | Classification | ||
| Chris | Chris | Chris | Returning | ||
| Natasha | Helen | Natasha | New | ||
| Helen | Mimi | Helen | Returning | ||
| Louisa | Robert | Louisa | New | ||
| Victoria | Barbara | Robert | Returning | ||
| Robert | Victoria | New | |||
| Mimi | Lost | ||||
| Barbara | Lost |
- บรรทัดที่ 7-11: นำตารางของทั้งสองปีมาผนวกกันโดยใช้ฟังก์ชัน Table.Combine
- บรรทัดที่ 14-23: ผสานคอลัมน์ Customers This Year เข้ากับคอลัมน์ Customers Last Year โดยใช้ฟังก์ชัน Table.CombineColumns
- บรรทัดที่ 26-34: ลบชื่อลูกค้าที่ซ้ำออกด้วยฟังก์ชัน Table.Distinct
- บรรทัดที่ 31-34: เปลี่ยนชื่อคอลัมน์ที่ตอนนี้มีเพียงอันเดียวจาก Merged ไปเป็น Customer โดยใช้ฟังก์ชัน Table.RenameColumns
- บรรทัดที่ 37-42: จอยคิวรีนี้กับตาราง ThisYearCustomers โดยใช้ฟังก์ชัน Table.NestedJoin
- บรรทัดที่ 46-51: หาจำนวนรวมของลูกค้าปีนี้ เครื่องหมาย # และ ” ” ถูกนำมาใช้เพื่อให้สามารถตั้งชื่อค่า (Aggregate NewColumn) ที่มีเคาะวรรคภายในชื่อได้
- บรรทัดที่ 54-57: เปลี่ยนชื่อคอลัมน์จาก Count (Not Blank) of NewColumn.Customers This Year ไปเป็น ThisYear
- บรรทัดที่ 60-65: จอยคิวรีนี้กับตาราง LastYearCustomers
- บรรทัดที่ 69-74: หาจำนวนรวมของลูกค้าปีก่อน
- บรรทัดที่ 77-80: เปลี่ยนชื่อคอลัมน์จาก Count (Not Blank) of NewColumn.Customers Last Year ไปเป็น LastYear
- บรรทัดที่ 84-90: จำแนกกลุ่มของลูกค้าโดยใช้คอลัมน์ ThisYear และ LastYear
- บรรทัดที่ 93-96: ลบคอลัมน์ที่ไม่ต้องการ
บทความตอนนี้พูดถึงการหาเลขอันดับของยอดขาย การนับจำนวนลูกค้าที่ไม่ซ้ำกัน การแปลงคอลัมน์เดียวให้กลายเป็นหลาย ๆ คอลัมน์ การหาลูกค้าใหม่ ลูกค้าที่หายไป และลูกค้าที่กลับคืนมา ในตอนต่อไปจะเป็นเรื่องการประยุกต์ใช้คิวรีภาษาเอ็มเพื่อการประมวลผลที่มีประโยชน์ต่องานบิซิเนสอินเทลลิเจนซ์และเทคนิคต่าง ๆ ที่น่าสนใจ