---
schema_version: "1"
id: 001f2f7b6ccf9645b507a9e1581859a4971d1fd7a7e99f8815200f4a63e6f181
title: 对数据进行转置（从列到行）
collection: tableau
version: next
locale: zh-cn
portal_url: https://docs.salesforce.com/tableau/next/zh-cn/public/desktop/pivot.md
canonical_url: https://help.tableau.com/v0.0/public/desktop/zh-cn/pivot.htm
source_site: help.tableau.com
content_type: documentation
content_hash: 8bef61ff9ba5603314784cbfcfedad2545d749d05c967a8395c54b918feafe49
description: Pivot data from crosstab columns to rows, including via custom SQL.
---
[跳转到主要内容](#main-content)

# 对数据进行转置（从列到行）

有时，在 Tableau 中分析以交叉表格式存储的数据可能很困难。在处理 Microsoft Excel、文本文件、Google Sheets 和 .pdf 数据源时，您可以对数据进行透视，从交叉表格式转换为分列格式。如果使用其他数据源，您可以[使用自定义 SQL 进行透视 (Tableau Desktop)](#Pivot)。

例如，假设在三个单独的字段中有按季度针对三个供应商销售的设备数量。您可以对数据进行透视，以便供应商位于一个字段中，销售的设备数量位于另一个字段中。

![内容从列转置为行。](/tableau/next/zh-cn/public/desktop/zh-cn/Img/qs_pivot_example.png)

## 对数据进行透视

设置数据源之后，在网格中选择两个或更多列。单击列名称旁边的下拉箭头，然后选择“行转置为列”。将创建名为“行转置为列字段名称”和行转置为列字段值”的新列并将其添加到数据源。新列将替换您在创建行转置为列时选择的原始列。

![字段上的上下文菜单，其中包含转置字段的选项。](/tableau/next/zh-cn/public/desktop/zh-cn/Img/qs_pivot_command.png)

## 添加到行转置为列

若要将更多数据添加到行转置为列，请选择另一个列，单击列名称旁边的下拉箭头，然后选择“将数据添加到行转置为列”。在开始分析之前，请确保行转置为列列和值按预期方式显示。

![字段的上下文菜单，带有将数据添加到数据透视表的选项。](/tableau/next/zh-cn/public/desktop/zh-cn/Img/qs_pivot_add.png)

若要移除行转置为列，请单击行转置为列列名称旁边的下拉箭头，然后选择“移除行转置为列”。

## 行转置为列疑难解答

- **视图中的红色字段以及“数据”窗格中带有感叹号的字段**：由于原始字段已替换为新的行转置为列字段，因此对视图中原始字段的任何引用将不再起作用。它们会致字段在视图中变为红色，或在“数据”窗格中的字段旁边显示红色感叹号。
- **网格中的空值：**举例来说，如果在数据提取刷新中移除了行转置为列中使用的所有原始字段，则行转置为列字段中会显示空值。
- **无行转置为列选项：**当您在单一 Microsoft Excel、文本文件、Google Sheets 和 .pdf 数据源中选择两个或更多列时，将出现行转置为列。如果在 Tableau Desktop 中使用其他数据源，您可以使用自定义 SQL 进行透视。

## 使用自定义 SQL 进行透视 (Tableau Desktop)

即使未使用 Excel、文本文件、Google Sheets 和 .pdf 数据源，您也可以使用自定义 SQL 对数据进行透视。在自定义 SQL 查询中使用 UNION ALL 运算符时，可以获取不同列中的值并将它们放到新列中。

例如，假设您有一个名为 **Contest** 的表。

**Contest**

| Runner | Start Time | End Time |
| --- | --- | --- |
| Amanda | 9/3/2016 3:04 PM | 9/3/2016 3:25 PM |
| Oscar | 9/3/2016 3:04 PM | 9/3/2016 3:21 PM |
| William | 9/3/2016 3:04 PM | 9/3/2016 3:16 PM |

若要在 Tableau 中优化此数据的分析，您可以使用下面的自定义 SQL 查询，对“Start Time”和“End Time”列进行透视，使其值在单个列中。

Select \[Runner\]

, 'Start' as \[Action\]

, \[Start Time\] as \[Time\]

From \[Contest\]

Union ALL

Select \[Runner\]

, 'End' as \[Action\]

, \[End Time\] as \[Time\]

From \[Contest\]

上述自定义 SQL 查询执行以下操作：

- 对**“Start Time”**列标题进行透视，使其转换为一个名为**“Start”**的字符串值，并将该值添加到一个名为**“Action”**的新列中。
- 对**“End Time”**列标题进行透视，使其转换为一个名为**“End”**的字符串值，并将该值添加到一个名为**“Action”**的新列中。
- 对**“Start Time”**和**“End Time”**列进行透视，使其值在一个名为**“Time”**的新列中。

下表显示了此自定义 SQL 查询的结果。

<table style="width: 80%;mc-table-style: url('Resources/TableStyles/Basic-Border-Light.css');" class="TableStyle-Basic-Border" cellspacing="0"><colgroup><col class="TableStyle-Basic-Border-Column-Column1"><col class="TableStyle-Basic-Border-Column-Column1"><col class="TableStyle-Basic-Border-Column-Column1"></colgroup><thead><tr class="TableStyle-Basic-Border-Head-Header1"><th class="TableStyle-Basic-Border-HeadE-Column1-Header1">Runner</th><th class="TableStyle-Basic-Border-HeadE-Column1-Header1">Action</th><th class="TableStyle-Basic-Border-HeadD-Column1-Header1">Time</th></tr></thead><tbody><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">Amanda</td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><p>Start</p></td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1">9/3/2016 3:04 PM</td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">Oscar</td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">Start</td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1">9/3/2016 3:04 PM</td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">William</td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">Start</td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1">9/3/2016 3:04 PM</td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">Amanda</td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">End</td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1">9/3/2016 3:25 PM</td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">Oscar</td><td class="TableStyle-Basic-Border-BodyE-Column1-Body1">End</td><td class="TableStyle-Basic-Border-BodyD-Column1-Body1">9/3/2016 3:21 PM</td></tr><tr class="TableStyle-Basic-Border-Body-Body1"><td class="TableStyle-Basic-Border-BodyB-Column1-Body1">William</td><td class="TableStyle-Basic-Border-BodyB-Column1-Body1">End</td><td class="TableStyle-Basic-Border-BodyA-Column1-Body1">9/3/2016 3:16 PM</td></tr></tbody></table>

### 使用自定义 SQL 进行数据透视

1. 连接到数据。
2. 双击左侧窗格中的“新建自定义 SQL”选项。有关详细信息，请参见[连接到自定义 SQL 查询](https://help.tableau.com/v0.0/public/desktop/zh-cn/customsql.htm)。
3. 在“编辑自定义 SQL”对话框中，复制并粘贴以下自定义 SQL 查询，并将内容替换为关于表的信息：
    
    Select \[_Static Column_\]
    
    , '_New Value (from Column Header 1)_' as \[_New Column Header_\]
    
    , \[_Pivot Column Values 1_\] as \[_New Values_\]
    
    From \[_Table_\]
    
    Union ALL
    
    Select \[_Static Column_\]
    
    , '_New Value (from Column Header 2_' as \[_New Column Header_\]
    
    , \[_Pivot Column Values 2_\] as \[_New Values_\]
    
    From \[_Table_\]
    
    Union ALL
    
    Select \[_Static Column_\]
    
    , '_New Value (from Column Header 3_' as \[_New Column Header_\]
    
    , \[_Pivot Column Values 3_\] as \[_New Values_\]
    
    From \[_Table_\]
    
    如果以下条件为真：
    
    - _Static Column（静态列）_： _Table（表）_中列（维度和度量）的逗号分隔列表，不应该包括在行转置为列中。
    - _New Value (from Column Header 1-3)（新值（来自列标题 1-3））_：您为原始列标题提供的新名称，用作行转置为列中的行值。
    - _Pivot Column Values 1-3（行转置为列列值 1-3）_：需要对其值进行透视以转换成单一列的列。
    - _New Column Header（新列标题）_：为新列提供的名称，此新列包含_“New Value (from Column Header 1-3)”（新值（来自列标题 1-3））_中的新行值。
    - _New Values（新值）_： 为新列提供的名称，此新列包含_“Pivot Column Values 1-3”（行转置为列列值 1-3）_中的原始值。
    - _Table（表）_： 连接到的表。
4. 单击“确定”。