Thep Excel

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

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

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

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
8/10

Difficulty
3/10

Usefulness
8/10

Syntax & Arguments

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

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

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"
DAX Formula:

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"
)

Result:

ถ้า 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 จะคืนผลลัพธ์ทันที ไม่ต้องประเมินเงื่อนไขที่เหลือ
DAX Formula:

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

Result:

ถ้ายอดขาย >= 1,000,000 จะคืน "Platinum"

ใช้กับ SELECTEDVALUE() – สลับ Metric ผ่าน Slicer
KPI Value = VAR SelectedMetric = SELECTEDVALUE(Metrics[MetricName], "Sales") RETURN SWITCH( SelectedMetric, "Sales", [Total Sales], "Profit", [Total Profit], "Q…
ใช้ SELECTEDVALUE() อ่านค่าจาก Slicer (หรือตัวแปร dropdown) แล้วใช้ SWITCH เลือก Measure ที่ต้องแสดง ทำให้สร้าง Card/Chart ตัวเดียวที่สลับหลายตัวชี้วัดได้
DAX Formula:

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]
)

Result:

ถ้าสลับ Slicer เป็น "Profit" จะแสดง [Total Profit]

จำแนก Risk Level ตามเงื่อนไขหลายตัว – SWITCH(TRUE()) กับ AND/OR
Risk Assessment = VAR DaysOverdue = TODAY() - Orders[DueDate] VAR OrderAmount = Orders[Amount] RETURN SWITCH( TRUE(), DaysOverdue > 60 OR OrderAmount > 50000, "…
ใช้ VAR เก็บค่ากลางเพื่อ reuse และมองเห็นอ่านง่าย ลองแล้ว AND/OR เงื่อนไขซับซ้อนกว่า SWITCH(TRUE()) จะชัดเจนมากว่าจะเกิดอะไรขึ้น
DAX Formula:

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"
)

Result:

ถ้า 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

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 ซ้อนหลายชั้น

Leave a Reply

Your email address will not be published. Required fields are marked *