---
title: SWITCH – คืนค่าตามหลายกรณี ปลดปล่อยตัวเองจาก IF ซ้อน
url: https://www.thepexcel.com/functions/dax/logical/switch-dax/
type: function-explainer
program: DAX
syntax: "SWITCH(<expression>, <value1>, <result1>[, <value1>, <result1>]...[, <else>])"
date: 2025-12-13
updated: 2025-12-20
scores:
  popularity: 8
  difficulty: 3
  usefulness: 8
---

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

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

## คำอธิบาย

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

## Syntax

```excel
SWITCH(&lt;expression&gt;, &lt;value1&gt;, &lt;result1&gt;[, &lt;value1&gt;, &lt;result1&gt;]...[, &lt;else&gt;])
```

**Variant**

```excel
SWITCH(&lt;expression&gt;, &lt;value1&gt;, &lt;result1&gt;, &lt;value2&gt;, &lt;result2&gt;, &lt;else&gt;)
```

เปรียบเทียบ expression กับหลายค่า แล้วคืนผลลัพธ์ตามคู่ value/result

**Variant**

```excel
SWITCH(TRUE(), &lt;condition1&gt;, &lt;result1&gt;, &lt;condition2&gt;, &lt;result2&gt;, &lt;else&gt;)
```

รูปแบบยอดนิยมสำหรับเงื่อนไขแบบช่วง โดยใช้ TRUE() เป็นตัวตั้งต้น

## Arguments

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

## เคสการใช้งาน

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

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

_เหมาะกับ:_ mapping

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

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

_เหมาะกับ:_ segmentation

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

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

_เหมาะกับ:_ dynamic-measure

## ตัวอย่าง

### 1. ตัวอย่างพื้นฐาน: แมปรหัส Month เป็นชื่อเดือน

```excel
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"`

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

### 2. SWITCH(TRUE()) สำหรับเงื่อนไขแบบช่วง - จำแนก Tier ตามยอดขาย

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

**ผลลัพธ์:** `ถ้ายอดขาย >= 1,000,000 จะคืน "Platinum"`

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

### 3. ใช้กับ SELECTEDVALUE() - สลับ Metric ผ่าน Slicer

```excel
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]`

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

### 4. จำแนก Risk Level ตามเงื่อนไขหลายตัว - SWITCH(TRUE()) กับ AND/OR

```excel
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"`

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

## หมายเหตุเพิ่มเติม

- ใช้ VAR เพื่อเก็บค่ากลาง SWITCH ทำให้โค้ดอ่านง่ายและ debug ได้เร็ว

- SWITCH(TRUE()) ช่วยชีวิตเมื่อมีเงื่อนไขหลายกรณี แทนการเขียน IF ซ้อนหลายชั้น

- เรียงเงื่อนไข SWITCH(TRUE()) จากเข้มงวด (ค่าสูง) ไปสามัญ (ค่าต่ำ) เพื่อกันเงื่อนไขทับกัน

- ถ้าทำการเทียบแต่ละค่าเท่ากัน SWITCH ทำให้อ่าน syntax ดีกว่า IF ตัวเดียวหลายชั้น

- SWITCH ใช้ได้กับ measures ในระดับ filter context จึงเหมาะสำหรับ summary/aggregation

## คำถามที่พบบ่อย

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

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

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

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

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

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

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

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

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

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

**Q: SWITCH ใช้ในที่ไหนได้บ้าง?**

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

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

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

## ฟังก์ชันที่เกี่ยวข้อง

- [IF – ตรวจสอบเงื่อนไขและคืนค่าตามผลลัพธ์ TRUE/FALSE](https://www.thepexcel.com/functions/dax/logical/if-dax/)
- [SELECTEDVALUE – ดึงค่าเดียวจาก Filter Context](https://www.thepexcel.com/functions/dax/filter/selectedvalue-dax/)
- [AND – ตรวจสอบเงื่อนไขตรรกะในDAX](https://www.thepexcel.com/functions/dax/logical/and-dax/)
- [OR – ตรวจสอบว่ามีเงื่อนไขใดเป็นจริง](https://www.thepexcel.com/functions/dax/logical/or-dax/)
- [NOT – กลับค่าตรรกะ (TRUE/FALSE)](https://www.thepexcel.com/functions/dax/logical/not-dax/)
- [BLANK – คืนค่าว่าง (Empty Value)](https://www.thepexcel.com/functions/dax/other/blank-dax/)
- [TRUE – คืนค่าตรรกะ TRUE](https://www.thepexcel.com/functions/dax/logical/true-dax/)
- [FALSE – คืนค่าตรรกะ FALSE](https://www.thepexcel.com/functions/dax/logical/false-dax/)

## แหล่งข้อมูลเพิ่มเติม

- [DAX Guide: SWITCH](https://dax.guide/switch/) _(guide)_
- [Microsoft Learn: SWITCH](https://learn.microsoft.com/en-us/dax/switch-function-dax) _(official)_
- [SQLBI: Optimizing SWITCH Expressions](https://www.sqlbi.com/articles/optimizing-switch-expressions-using-variables-in-dax/) _(guide)_

---

_Source: [https://www.thepexcel.com/functions/dax/logical/switch-dax/](https://www.thepexcel.com/functions/dax/logical/switch-dax/)_
