如何在第一行中显示第二行和第三行列值作为sql

时间:2017-06-15 06:58:29

标签: sql

我有情况需要展示第二个&第一行中的第三行列值作为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

任何人请帮助我。 在此先感谢

1 个答案:

答案 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)