我正在AWS Glue中使用python3.6的环境pyspark中进行工作。我有这张桌子:
+----+-----+-----+-----+ |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代码更接近的信息:
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
如果您正在寻找动态解决方案,请尝试此…(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 | +------+-------+-------+-------+-------+