我们尝试在sql server 2012中使用unpivot运算符转置数据。我们必须使用postgres数据库输出。所以,我们必须将给定的语法重写为postgresql。
我们也尝试过postgresql: 使用给定查询结构的uncrosstab()函数。
{{1}}
即我们的输入sql server 2012语法是:
{{1}}
非常感谢任何帮助?
答案 0 :(得分:0)
PIVOT和UNPIVOT是我不熟悉的非ANSI标准SQL命令。我也没有完整的表格定义,所以我很难理解你的SQL。所以,我转向微软的网站,找到了一个可以使用的例子。
https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx
使用他们的UNPIVOT示例,我想出了两个解决方案。首先,让我们在Greenplum中创建一个表并插入一些值。
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int, Emp3 int, Emp4 int, Emp5 int)
distributed by (vendorid);
INSERT INTO pvt VALUES (1,4,3,5,4,4);
INSERT INTO pvt VALUES (2,4,1,5,5,5);
INSERT INTO pvt VALUES (3,4,3,5,4,4);
INSERT INTO pvt VALUES (4,4,2,5,5,4);
INSERT INTO pvt VALUES (5,5,1,5,5,5);
不受支持的Microsoft UNPIVOT示例:
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO
解决方案1
select vendorid, 'emp1' as employee, emp1 from pvt
union all
select vendorid, 'emp2' as employee, emp2 from pvt
union all
select vendorid, 'emp3' as employee, emp3 from pvt
union all
select vendorid, 'emp4' as employee, emp4 from pvt
union all
select vendorid, 'emp5' as employee, emp5 from pvt;
这很简单易写,但每个查询都是按顺序运行的。这也意味着您正在扫描5次pvt表,但它可能是适合您的解决方案。
解决方案2
select vendorid,
split_part(unpivot, ',', 1) as employee,
split_part(unpivot, ',', 2) as orders
from (
select vendorid, unnest(employee) as unpivot
from (
select vendorid,
array['emp1,' || emp1,
'emp2,' || emp2,
'emp3,' || emp3,
'emp4,' || emp4,
'emp5,' || emp5] as employee
from pvt
) as sub
) as sub2;
解决方案2有点冷却"因为它只通过pvt表一次并将不同的列转换为数组元素。我连接了列的名称,所以我可以为每个数组元素添加一个索引。然后我使用unexst将数组元素转换为行。最后,我使用split_part将每个数组索引+值拆分为单独的列。为了好玩,我打电话给这个" unpivot"。 :)
最后,我建议您存储数据,以便于使用。该建议也适用于任何数据库。如果您经常希望查看UNPIVOT结果的数据,请以这种方式存储数据。不要让分析比应该更难。