我有情况需要展示第二个&第一行中的第三行列值作为End的列值。
OrgCode | OrgType
------ | ------
001902001| 5
001902005| 5
001902000| 4
001903000| 4
Id | OrgType | materialId | materialCount
--- | ------ | -----------| -----------
1 | 5 | 793167 | 3
2 | 5 | 793257 | 3
3 | 5 | 794808 | 3
4 | 4 | 793167 | 10
5 | 4 | 793257 | 10
6 | 4 | 794808 | 10
基于这两个表,我需要最终输出,如下所示:
OrgCode | OrgType | Item1 | Count1 | Item2 | Count2 | Item3 | Count3
------ | ------- ----- ------ ------- ------- ------ ------
001902001| 5 | 793167 | 3 | 793257 | 3 | 794808 | 3
001902005| 5 | 793167 | 3 | 793257 | 3 | 794808 | 3
001902000| 4 | 793167 | 10 | 793257 | 10 | 794808 | 10
001903000| 4 | 793167 | 10 | 793257 | 10 | 794808 | 10
任何人请帮助我。 在此先感谢
答案 0 :(得分:0)
这个问题经常出现在论坛中,这是可以理解的,因为SQL不是为了实现人们觉得这么有用的数据透视表/交叉表功能而构建的。一个好的方法是将数据移动到自然的地方,如电子表格或数据操作语言,如R / python / Julia。无论如何,可以使用tablefunc
扩展名在Postgresql中执行此操作。查询看起来很复杂,但它很有启发性,如果你必须留在Postgresql里面(这很方便),那么这就是你要走的路:
CREATE extension tablefunc ;
-- table are called table1 and table2
SELECT tt.orgcode,
ss.orgtype,
item1,
count1,
item2,
count2,
item3,
count3
FROM
crosstab($$ select
a.orgcode,
'item'||row_number() over (partition by a.orgcode order by b.materialid) as name,
b.materialid
from table1 a,table2 b where a.orgtype=b.orgtype $$) AS
tt(orgcode integer, item1 integer, item2 integer, item3 integer),
crosstab ($$ select
a.orgcode,
'count'||row_number() over (partition by a.orgcode order by b.materialid) as name,
b.materialcount
from table1 a, table2 b where a.orgtype=b.orgtype $$) AS
qq(orgcode integer, count1 integer, count2 integer, count3 integer),
table1 ss
WHERE tt.orgcode=qq.orgcode
AND tt.orgcode=ss.orgcode
ORDER BY orgtype DESC,
tt.orgcode;
crosstab
函数采用包含三列的表格,例如A
B
C
,并创建一个包含第一列A
的表格和值B
作为更多列,C
的值作为记录的内容。该查询会对项目代码和计数两次调用crosstab
。
输出很好:
orgcode | orgtype | item1 | count1 | item2 | count2 | item3 | count3
---------+---------+--------+--------+--------+--------+--------+--------
1902001 | 5 | 793167 | 3 | 793257 | 3 | 794808 | 3
1902005 | 5 | 793167 | 3 | 793257 | 3 | 794808 | 3
1902000 | 4 | 793167 | 10 | 793257 | 10 | 794808 | 10
1903000 | 4 | 793167 | 10 | 793257 | 10 | 794808 | 10
(4 rows)