Thep Excel

SWITCHคืนค่าตามหลายกรณี ปลดปล่อยตัวเองจาก IF ซ้อน

SWITCH เป็นฟังก์ชันตรรมชาติสำหรับจัดการหลายกรณี ช่วยให้หลีกเลี่ยง IF ซ้อนหลายชั้น และสามารถใช้รูปแบบ SWITCH(TRUE()) ได้ สำหรับเงื่อนไขแบบช่วง (>=, <=) หรือเงื่อนไขซับซ้อน

fx
=SWITCH(<expression>, <value1>, <result1>[, <value1>, <result1>]…[, <else>])

ความนิยม8/10
ความยาก3/10
ประโยชน์8/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
expression Scalar นิพจน์หรือค่าที่ต้องการนำไปเทียบกับรายการ value สามารถเป็น column reference, measure, SELECTEDVALUE(), หรือนิพจน์อื่น ในกรณี SWITCH(TRUE()) ให้ใส่ TRUE() ที่นี่
value1 Scalar ค่าแรกที่ต้องการจับคู่กับ expression หรือ boolean expression (สำหรับ SWITCH(TRUE()))
result1 Scalar ผลลัพธ์ที่ต้องการคืนหากเข้าเงื่อนไขแรก สามารถเป็นข้อความ, ตัวเลข, measure reference ก็ได้
[else]ไม่บังคับ Scalar BLANK() ค่าเริ่มต้นที่ส่งกลับเมื่อไม่เข้าเงื่อนไขใดเลย ถ้าไม่ระบุ SWITCH จะคืน BLANK()

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

SWITCH คือ logical control function ที่เปรียบเทียบ expression กับรายการ value และคืนผลลัพธ์ที่ตรงกัน ลองนึกดู ถ้า expression ตรงกับ value ไหนสักตัว มันจะคืน result ของเจ้า value นั้นทันที

มี 2 รูปแบบหลัก:
1. **Simple matching** – เทียบค่าเท่ากับ: SWITCH(Month, 1, “Jan”, 2, “Feb”, …)
2. **SWITCH(TRUE())** – เงื่อนไขแบบช่วง: SWITCH(TRUE(), Sales >= 1000, “High”, “Low”) ซึ่งช่วยลดการเขียน IF ซ้อนกัน

ส่วนตัวผมชอบ SWITCH(TRUE()) เพราะมันสวยกว่า IF มาก โค้ดอ่านง่าย และเขียนเร็ว 😎 ไม่ต้องเหน็ดเหนื่อยกับวงเล็บ IF ซ้อนหลายชั้น

How it works

แมปรหัสเป็นข้อความ

เปลี่ยนรหัส/ตัวเลือกให้เป็นข้อความที่อ่านง่ายเพื่อแสดงในรายงาน

จัดกลุ่มเป็นหลายระดับ

แบ่งผลลัพธ์เป็นหลายระดับ เช่น A/B/C หรือ Low/Medium/High โดยไม่ต้องซ้อน IF หลายชั้น

เลือกสูตร/Measure ตามตัวเลือก

ใช้ SELECTEDVALUE อ่านตัวเลือกจาก Slicer แล้วให้ SWITCH คืนผลลัพธ์ตามตัวเลือกนั้น

Examples

ตัวอย่างพื้นฐาน: แมปรหัส Month เป็นชื่อเดือนMonth Name = SWITCH( Sales[MonthNumber], 1, "January", 2, "February", 3, "March", 4, "April", 5, "May", 6, "June", 7, "July", 8, "August", 9, "September", 10, "…

อ่านค่า MonthNumber จาก column แล้วแมปเป็นชื่อเดือน ถ้าเลขไม่ตรง (ไม่ใช่ 1-12) จะคืน "Invalid Month"

fx
Month Name =
SWITCH(
Sales[MonthNumber],
1, "January",
2, "February",
3, "March",
4, "April",
5, "May",
6, "June",
7, "July",
8, "August",
9, "September",
10, "October",
11, "November",
12, "December",
"Invalid Month"
)

ผลลัพธ์ถ้า MonthNumber = 3 จะคืน "March"
SWITCH(TRUE()) สำหรับเงื่อนไขแบบช่วง – จำแนก Tier ตามยอดขายCustomer Tier = SWITCH( TRUE(), SUM(Sales[Amount]) >= 1000000, "Platinum", SUM(Sales[Amount]) >= 500000, "Gold", SUM(Sales[Amount]) >= 100000, "Silver", "Bronze…

ใช้ TRUE() เป็น expression แล้วใส่เงื่อนไข >= เรียงจากมากไปน้อย เมื่อเงื่อนไขแรกเป็นจริง SWITCH จะคืนผลลัพธ์ทันที ไม่ต้องประเมินเงื่อนไขที่เหลือ

fx
Customer Tier =
SWITCH(
TRUE(),
SUM(Sales[Amount]) >= 1000000, "Platinum",
SUM(Sales[Amount]) >= 500000, "Gold",
SUM(Sales[Amount]) >= 100000, "Silver",
"Bronze"
)

ผลลัพธ์ถ้ายอดขาย >= 1,000,000 จะคืน "Platinum"
ใช้กับ SELECTEDVALUE() – สลับ Metric ผ่าน SlicerKPI Value = VAR SelectedMetric = SELECTEDVALUE(Metrics[MetricName], "Sales") RETURN SWITCH( SelectedMetric, "Sales", [Total Sales], "Profit", [Total Profit], "Q…

ใช้ SELECTEDVALUE() อ่านค่าจาก Slicer (หรือตัวแปร dropdown) แล้วใช้ SWITCH เลือก Measure ที่ต้องแสดง ทำให้สร้าง Card/Chart ตัวเดียวที่สลับหลายตัวชี้วัดได้

fx
KPI Value =
VAR SelectedMetric = SELECTEDVALUE(Metrics[MetricName], "Sales")
RETURN
SWITCH(
SelectedMetric,
"Sales", [Total Sales],
"Profit", [Total Profit],
"Quantity", [Total Quantity],
"Margin", [Profit Margin],
[Total Sales]
)

ผลลัพธ์ถ้าสลับ Slicer เป็น "Profit" จะแสดง [Total Profit]
จำแนก Risk Level ตามเงื่อนไขหลายตัว – SWITCH(TRUE()) กับ AND/ORRisk Assessment = VAR DaysOverdue = TODAY() – Orders[DueDate] VAR OrderAmount = Orders[Amount] RETURN SWITCH( TRUE(), DaysOverdue > 60 OR OrderAmount > 50000, "…

ใช้ VAR เก็บค่ากลางเพื่อ reuse และมองเห็นอ่านง่าย ลองแล้ว AND/OR เงื่อนไขซับซ้อนกว่า SWITCH(TRUE()) จะชัดเจนมากว่าจะเกิดอะไรขึ้น

fx
Risk Assessment =
VAR DaysOverdue = TODAY() – Orders[DueDate]
VAR OrderAmount = Orders[Amount]
RETURN
SWITCH(
TRUE(),
DaysOverdue > 60 OR OrderAmount > 50000, "Critical",
DaysOverdue > 30 AND OrderAmount > 10000, "High",
DaysOverdue > 0, "Medium",
"Low"
)

ผลลัพธ์ถ้า DaysOverdue > 60 หรือ Amount > 50K จะคืน "Critical"

FAQs

SWITCH กับ IF ต่างกันตรงไหน? ควรใช้อะไร?+

IF เหมาะสำหรับเงื่อนไขตัวเดียวหรือสองตัว แต่ SWITCH ใช้ดีกว่าเมื่อมี 3+ กรณี โค้ด SWITCH อ่านง่ายกว่า เหน็บความตั้งใจ ไม่ต้องเปิด-ปิดวงเล็บวุ่นวาย

เมื่อไหร่ต้องใช้ SWITCH(TRUE()) แทน SWITCH แบบปกติ?+

SWITCH ปกติ: จับคู่ค่าเท่ากับ เช่น เปรียบค่าเดือนหรือสถานะ | SWITCH(TRUE()): ใช้ได้กับเงื่อนไขช่วง (>=,

ถ้าเงื่อนไขหลายตัวตรงกันพร้อมกัน SWITCH จะคืนไหน?+

SWITCH ประเมิน sequential (เรียงลำดับ) มันจะคืนผลลัพธ์ของ condition แรกที่เป็นจริง condition ที่หลังจะไม่ถูกประเมินอีก (short-circuit evaluation)

ต้องเรียงเงื่อนไขอย่างไรใน SWITCH(TRUE())?+

เรียงจากเฉพาะเจาะจงมาสามัญ หรือจากเข้มงวด (สูง) มาอ่อน (ต่ำ) เพื่อกันเงื่อนไขทับกัน เช่น >= 1000 ก่อน >= 500 ต่อมา

ถ้าไม่ใส่ else จะเป็นอะไร?+

ถ้าไม่เข้าเงื่อนไขใดเลยและไม่ระบุ else SWITCH จะคืน BLANK() (ค่าว่าง)

SWITCH ใช้ในที่ไหนได้บ้าง?+

ได้ใช้ทั้งใน Calculated Column และ Measure ลองได้ตามใจชอบ SWITCH เป็น logical function ลักษณะเดียวกับ IF ก็ว่าได้

ทำไมใช้ SWITCH กับ table expression แล้ว error?+

SWITCH ต้องรับ scalar value (ค่าเดี่ยว) เท่านั้น ไม่สามารถใช้กับ table ได้ ถ้า expression คืนค่าเป็น table ต้องแปลงเป็น scalar ด้วยฟังก์ชันอย่าง COUNTROWS(), SUMX(), หรือ VALUES() ก่อน

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ SWITCH จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้SWITCHLogical
Logical (6)
AND

ตรวจสอบว่าเงื่อนไขตรรกะทั้งหมดเป็นจริงหรือไม่ และคืนค่า TRUE เมื่อทุกเงื่อนไขเป็น TRUE

FALSE

FALSE คืนค่าตรรกะ FALSE ใช้เป็นค่าคงที่ใน DAX สำหรับสร้างตรรกะและเงื่อนไข เช่น ใช้กับ IF หรือใช้เป็นค่าตั้งต้นในตัวแปร

IF

IF เป็นฟังก์ชันตรรกะพื้นฐานที่สำคัญที่สุดใน DAX ใช้สำหรับตรวจสอบเงื่อนไข (logical test) แล้วคืนค่าที่แตกต่างกันตามผลลัพธ์ว่าเป็นจริง (TRUE) หรือเท็จ (FALSE) สามารถใช้ได้ทั้งในบริบท calculated column, measure, calculated table และ visual calculation ซึ่งทำให้มีความยืดหยุ่นสูง คืนค่าเป็น scalar value ได้ทุกประเภท ไม่ว่าจะเป็นตัวเลข ข้อความ วันที่ หรือค่า boolean ถ้าไม่ระบุค่าสำหรับกรณีเท็จ (value_if_false) จะคืน BLANK() โดยอัตโนมัติ มีคุณสมบัติพิเศษคือ lazy evaluation behavior ที่ประมวลผลเฉพาะเส้นทาง (branch) ที่ถูกเลือกเท่านั้น ทำให้มีประสิทธิภาพในการทำงานที่ดี แตกต่างจาก Excel IF อย่างชัดเจนตรงที่ใช้รูปแบบอ้างอิงแบบ Table[Column] ทำงานภายใต้ filter context และแยกความแตกต่างระหว่าง BLANK กับ 0 อย่างเข้มงวด

NOT

NOT ใช้กลับค่าตรรกะของนิพจน์ (TRUE ↔ FALSE) เหมาะกับการเขียนเงื่อนไขแบบปฏิเสธ และนิยมใช้ร่วมกับ IF/AND/OR เพื่อสร้างตรรกะที่อ่านชัดเจน

OR

OR ตรวจสอบเงื่อนไขตรรกะ 2 ตัว และคืน TRUE เมื่อมีเงื่อนไขใดเงื่อนไขหนึ่งเป็น TRUE เหมาะกับการทำเงื่อนไขแบบ "อย่างน้อยหนึ่งข้อ" และนิยมเขียนด้วยตัวดำเนินการ || ในงานจริง

TRUE

TRUE คืนค่าตรรกะ TRUE ใช้เป็นค่าคงที่ใน DAX เช่น ใช้กับ SWITCH(TRUE()) เพื่อจัดการเงื่อนไขหลายระดับ หรือใช้ร่วมกับ IF/AND/OR ในการสร้างตรรกะ

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่