在SQL中将列转换为行

问题描述 投票:1回答:1

我有一个场景在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作为我的数据存储区。任何帮助深表感谢

sql hive transformation
1个回答
1
投票

你可以用这个:

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;
© www.soinside.com 2019 - 2024. All rights reserved.