分解表以按列进行透视(SQL、PYSPARK)

Break down a table to pivot in columns (SQL,PYSPARK)(分解表以按列进行透视(SQL、PYSPARK))
本文介绍了分解表以按列进行透视(SQL、PYSPARK)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我正在使用 AWS Glue 中的 python3.6 环境在 pyspark 中工作.我有这张桌子:

I'm working in an environment pyspark with python3.6 in AWS Glue. I have this table :

+----+-----+-----+-----+
|year|month|total| loop|
+----+-----+-----+-----+
|2012|    1|   20|loop1|
|2012|    2|   30|loop1|
|2012|    1|   10|loop2|
|2012|    2|    5|loop2|
|2012|    1|   50|loop3|
|2012|    2|   60|loop3|
+----+-----+-----+-----+

我需要得到如下输出:

year    month   total_loop1 total_loop2 total_loop3
2012    1         20           10           50
2012    2         30           5            60

我越接近 SQL 代码:

The closer I have gotten is with the SQL code:

select a.year,a.month, a.total,b.total from test a 
left join test b
on a.loop <> b.loop 
and a.year = b.year and a.month=b.month

输出仍然到目前为止:

+----+-----+-----+-----+
|year|month|total|total|
+----+-----+-----+-----+
|2012|    1|   20|   10|
|2012|    1|   20|   50|
|2012|    1|   10|   20|
|2012|    1|   10|   50|
|2012|    1|   50|   20|
|2012|    1|   50|   10|
|2012|    2|   30|    5|
|2012|    2|   30|   60|
|2012|    2|    5|   30|
|2012|    2|    5|   60|
|2012|    2|   60|   30|
|2012|    2|   60|    5|
+----+-----+-----+-----+

我该怎么做?非常感谢

推荐答案

表脚本和示例数据

CREATE TABLE [TableName](
    [year] [nvarchar](50) NULL,
    [month] [int] NULL,
    [total] [int] NULL,
    [loop] [nvarchar](50) NULL
) 

INSERT [TableName] ([year], [month], [total], [loop]) VALUES (N'2012', 1, 20, N'loop1')
INSERT [TableName] ([year], [month], [total], [loop]) VALUES (N'2012', 2, 30, N'loop1')
INSERT [TableName] ([year], [month], [total], [loop]) VALUES (N'2012', 1, 10, N'loop2')
INSERT [TableName] ([year], [month], [total], [loop]) VALUES (N'2012', 2, 5, N'loop2')
INSERT [TableName] ([year], [month], [total], [loop]) VALUES (N'2012', 1, 50, N'loop3')
INSERT [TableName] ([year], [month], [total], [loop]) VALUES (N'2012', 2, 60, N'loop3')

使用枢轴功能...

SELECT * 
FROM   TableName
       PIVOT(Max([total]) 
            FOR [loop] IN ([loop1], [loop2], [loop3]) ) pvt

在线演示:http://www.sqlfiddle.com/#!18/164a4/1/0

如果您正在寻找动态解决方案,那么试试这个...(动态枢轴)

If you are looking for a dynamic solution, then try this... (Dynamic Pivot)

DECLARE @cols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ',' + Quotename([loop])
         FROM   TableName
         FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 

DECLARE @query AS NVARCHAR(max) =  'SELECT * 
                                    FROM   TableName
                                           PIVOT(Max([total]) 
                                                FOR [loop] IN ('+ @cols +') ) pvt';

EXECUTE(@query) 

在线演示:http://www.sqlfiddle.com/#!18/164a4/3/0

输出

+------+-------+-------+-------+-------+
| year | month | loop1 | loop2 | loop3 |
+------+-------+-------+-------+-------+
| 2012 |     1 |    20 |    10 |    50 |
| 2012 |     2 |    30 |     5 |    60 |
+------+-------+-------+-------+-------+

这篇关于分解表以按列进行透视(SQL、PYSPARK)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

Simulating MySQL#39;s ORDER BY FIELD() in Postgresql(在 Postgresql 中模拟 MySQL 的 ORDER BY FIELD())
Using MySQL query to traverse rows to make a recursive tree(使用MySQL查询遍历行制作递归树)
MySQL LOAD DATA INFILE with ON DUPLICATE KEY UPDATE(MySQL LOAD DATA INFILE 和 ON DUPLICATE KEY UPDATE)
Search for quot;whole word matchquot; in MySQL(搜索“全字匹配在 MySQL 中)
add column to mysql table if it does not exist(如果不存在,则将列添加到 mysql 表)
MIN/MAX vs ORDER BY and LIMIT(MIN/MAX 与 ORDER BY 和 LIMIT)