在SQL中将列转换为行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SQL中将列转换为行相关的知识,希望对你有一定的参考价值。

我有一个场景在Hive上进行报告的其中一个实现。我有一个表结构,目前看起来如下 -

+------+------+----------+----------+-------+-------+--------+--------+
| Col1 | Col2 | M1_Today | M2_Today | M1_LW | M2_LW | M1_L2W | M2_L2W |
+------+------+----------+----------+-------+-------+--------+--------+
| A    | A1   |       10 |      200 |     9 |   190 |     11 |    210 |
| A    | A2   |       12 |      210 |    11 |   200 |     13 |    220 |
| B    | B1   |       15 |      300 |    14 |   290 |     16 |    310 |
| B    | B2   |       18 |      310 |    17 |   300 |     19 |    320 |
+------+------+----------+----------+-------+-------+--------+--------+

表格中的列需要转换为如下所示 -

+------+------+-------+----+-----+
| Col1 | Col2 | Col3  | M1 | M2  |
+------+------+-------+----+-----+
| A    | A1   | Today | 10 | 200 |
| A    | A1   | LW    |  9 | 190 |
| A    | A1   | L2W   | 11 | 210 |
| A    | A2   | Today | 12 | 210 |
| A    | A2   | LW    | 11 | 200 |
| A    | A2   | L2W   | 13 | 220 |
| B    | B1   | Today | 15 | 300 |
| B    | B1   | LW    | 16 | 310 |
| B    | B1   | L2W   | 14 | 290 |
| B    | B2   | Today | 18 | 310 |
| B    | B2   | LW    | 17 | 300 |
| B    | B2   | L2W   | 19 | 320 |
+------+------+-------+----+-----+

如何通过SQL实现这一目标。我正在使用HIVE作为我的数据存储区。任何帮助深表感谢

答案

你可以用这个:

SELECT Col1, Col2, 'Today' AS Col3 , M1_Today AS M1, M2_Today AS M2 
FROM table_name
UNION ALL
SELECT Col1, Col2, 'LW' AS Col3 , M1_LW AS M1, M2_LW AS M2 
FROM table_name 
UNION ALL
SELECT Col1, Col2, 'L2W' AS Col3 , M1_L2W AS M1, M2_L2W AS M2 
FROM table_name
ORDER BY Col1, Col2, Col3 DESC;

以上是关于在SQL中将列转换为行的主要内容,如果未能解决你的问题,请参考以下文章

在 ORACLE SQL 中将一组列转换为行

如何在 Sql Server 2008 R2 中将列转换为行?

在Oracle中将列转换为行[重复]

在 SQL 中将列反转为行

在python中将列转换为行[重复]

在 Oracle 11g 中将列转换为行