您的位置:

SQL列转行详解

一、SQL列转行函数

SQL列转行是指将一行中的多个列转成多行,使得每一行只有一个数据列。为了实现这一目标,我们可以使用UNPIVOT操作符和CROSS APPLY运算符。

SELECT *
FROM   (SELECT col1, col2, col3
        FROM   mytable) p
UNPIVOT (value FOR colname IN (col1, col2, col3)) AS unpvt
CROSS APPLY (SELECT 'col1' AS colname
             UNION ALL
             SELECT 'col2'
             UNION ALL
             SELECT 'col3') colnames
WHERE  colnames.colname = unpvt.colname;

在上述代码中,我们首先使用子查询返回指定表格的列。接下来使用UNPIVOT将每个列的值转换为行,并使用CROSS APPLY添加一个列名的列。最后使用WHERE过滤出正确的行。

二、SQL列转行可以只转一部分

如果我们想仅仅将表格的指定列转换为行,可以使用如下代码:

SELECT *
FROM   (SELECT col1, col2, col3
        FROM   mytable) p
UNPIVOT (value FOR colname IN (col2, col3)) AS unpvt
CROSS APPLY (SELECT 'col2' AS colname
             UNION ALL
             SELECT 'col3') colnames
WHERE  colnames.colname = unpvt.colname;

在这个示例中,我们只转换了第二个和第三个列(col2和col3)。这是通过在第12行中对UNPIVOT操作符传递col2和col3作为列名的方法实现的。

三、SQL列转行语句

通常,在SQL中,我们可以使用SELECT语句来转换列为行。

SELECT Col1, 'Col2' as ColumnName, Col2 from TableName
UNION ALL
SELECT Col1, 'Col3' as ColumnName, Col3 from TableName
UNION ALL
SELECT Col1, 'Col4' as ColumnName, Col4 from TableName
UNION ALL
SELECT Col1, 'Col5' as ColumnName, Col5 from TableName

上述SQL语句会将某个表格中的Col2、Col3、Col4和Col5转换为行。每个UNION子查询都包含一个SELECT语句,该语句将指定的列的值作为单行返回。

四、SQL列转行 map

如果我们需要将多个列转换为单个行,可以使用如下代码进行转换:

SELECT Col1,
       Stuff((SELECT ', ' + Cast(Col2 as varchar(10)) FROM TableName 
              WHERE Col1 = t.Col1
              FOR XML PATH('')), 1, 2, '') Col2
FROM TableName t
GROUP BY Col1

在上述代码示例中,我们首先使用GROUP BY子句分组列,然后使用Stuff函数将多个列的值连接为单个行。注意,我们使用Cast函数将Col2的值转换为varchar类型。

五、MySQL列转行函数

如果我们使用MySQL数据库,可以使用GROUP_CONCAT函数将多个列合并为单个行:

SELECT Col1, GROUP_CONCAT(Col2 SEPARATOR ', ') AS Col2
FROM TableName
GROUP BY Col1;

在上述代码示例中,我们使用GROUP_CONCAT函数将Col2的值与逗号分隔符连接为单个行。

六、MySQL列转行的方法

下面的代码示例展示了一种基于MySQL PIVOT表的方法,将列转换为行:

SELECT ColumnHeader, 
       IF(ColumnName = 'Col2', Col2, NULL) AS Col2, 
       IF(ColumnName = 'Col3', Col3, NULL) AS Col3,
       IF(ColumnName = 'Col4', Col4, NULL) AS Col4,
       IF(ColumnName = 'Col5', Col5, NULL) AS Col5
FROM (SELECT 'Col2' AS ColumnName UNION ALL
      SELECT 'Col3' UNION ALL
      SELECT 'Col4' UNION ALL
      SELECT 'Col5'
     ) colnames
LEFT JOIN (SELECT 'Col2' AS ColumnName, Col2 FROM TableName UNION ALL
           SELECT 'Col3', Col3 FROM TableName UNION ALL
           SELECT 'Col4', Col4 FROM TableName UNION ALL
           SELECT 'Col5', Col5 FROM TableName
          ) pvt
ON colnames.ColumnName = pvt.ColumnName;

在上述代码示例中,我们使用UNION ALL和SELECT语句来返回要转换的列。然后使用LEFT JOIN将映射到每个列名的值组合成一个单独的行。

七、SQL Server列转行

如果我们想在SQL Server中将列转换为行,可以使用如下代码:

SELECT Col1, 'Col2' ColumnName, Col2
FROM TableName
UNION ALL
SELECT Col1, 'Col3' ColumnName, Col3 
FROM TableName
UNION ALL
SELECT Col1, 'Col4' ColumnName, Col4 
FROM TableName
UNION ALL 
SELECT Col1, 'Col5' ColumnName, Col5 
FROM TableName;

在这个示例中,我们只是使用UNION ALL将指定的列连接到单个查询结果中。在结果中,每个行都包含Col1列中的值和特定的列的值。

八、SQL列转行查询

下面的代码示例展示了一种使用UNION ALL和SELECT语句将列转换为行的方法:

SELECT Col1, 'Col2' AS ColumnName, Col2 AS ColumnValue
FROM TableName
UNION ALL
SELECT Col1, 'Col3', Col3
FROM TableName
UNION ALL
SELECT Col1, 'Col4', Col4
FROM TableName
UNION ALL
SELECT Col1, 'Col5', Col5
FROM TableName;

在上述代码示例中,我们使用UNION ALL将每个SELECT语句的结果连接到单个结果集中。注意,我们在每个SELECT语句中都指定了ColumnName和ColumnValue列。

九、SQL列转行最简单的方法

最简单的列转行技术是将所有列通过UNION ALL合并到一个列中:

SELECT Col1, Col2 AS ColValue
FROM TableName
UNION ALL
SELECT Col1, Col3 AS ColValue
FROM TableName
UNION ALL
SELECT Col1, Col4 AS ColValue
FROM TableName
UNION ALL
SELECT Col1, Col5 AS ColValue
FROM TableName;

在上述代码示例中,我们只是使用SELECT语句将每个列转换为单个行。在每一行中,我们使用AS关键字将列值指定为一个名为ColValue的列。

十、SQL列转行逗号连接

有时候,我们希望将多个列的值连接起来,形成一个逗号分隔的字符串。要做到这一点,可以使用如下代码:

SELECT Col1,
       Stuff((SELECT ', ' + Col2
              FROM TableName 
              WHERE Col1 = t.Col1
              FOR XML PATH('')), 1, 2, '') AS Col2
FROM TableName t
GROUP BY Col1

在上述代码示例中,我们使用GROUP BY子句分组列,然后使用Stuff函数将多个列的值连接为单个行。注意,在这个示例中,我们没有显式转换列,而是直接连接列值。